ฉันจะสร้างไฟล์ขนาดใหญ่ได้อย่างรวดเร็วได้อย่างไร


คำตอบ:


36

วิธีzero-fill (แก้ไขที่นี่เพื่อหลีกเลี่ยงปัญหาคอขวดของหน่วยความจำที่อาจเกิดขึ้น ) ใช้เวลา 17 วินาทีในการสร้างไฟล์ 10 GB บน SSD และทำให้อินเทอร์เฟซกราฟิกของ Ubuntu ไม่ตอบสนอง

$ time sh -c 'dd if=/dev/zero iflag=count_bytes count=10G bs=1M of=large; sync'
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 17.2003 s, 624 MB/s

real    0m17.642s
user    0m0.008s
sys     0m9.404s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
10737422336     large

fallocateสร้างไฟล์ขนาดใหญ่ทันทีโดยจัดการพื้นที่ดิสก์ที่จัดสรรโดยตรงของไฟล์:

$ time sh -c 'fallocate -l 10G large; sync'

real    0m0.038s
user    0m0.000s
sys     0m0.016s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
10737422336     large

truncateสามารถใช้งานได้ทันทีและสร้างไฟล์แบบเบาบางซึ่งไม่ใช้พื้นที่ดิสก์จริงจนกว่าจะมีการเขียนข้อมูลในภายหลัง:

$ time sh -c 'truncate -s 10G large; sync'

real    0m0.014s
user    0m0.000s
sys     0m0.004s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
0       large

dd ... bs=2G count=1อ่าน 2 GB ในหน่วยความจำ (ในการread(2)โทรหนึ่งครั้ง) หากคุณมีแรงกดดันด้านความจำนั่นอาจไม่ใช่วิธีที่คุณควรทำ ยิ่งบล็อกที่มีขนาดเล็กลงอาจจะเร็วกว่าหากหมายถึงการเพจน้อย
claymation

19

วิธีที่ง่ายคือการใช้ddคำสั่งเพื่อเขียนไฟล์ที่มีค่าเป็นศูนย์

dd if=/dev/zero of=outputFile bs=2G count=1
  • if = ไฟล์อินพุต
  • of = ไฟล์เอาต์พุต
  • bs = ไบต์

ใช้ G ในอาร์กิวเมนต์ size หากคุณต้องการคอมพิวเตอร์ (1024 * 1024 * 1024) กิกะไบต์หรือ GB หากคุณต้องการกิกะไบต์ (1000 * 1000 * 1000) มนุษย์


1
ฉันเพิ่งจะเพิ่มว่าถ้าคุณไม่ต้องการที่ศูนย์ทั้งหมดท่านสามารถเลือก if = / dev / สุ่ม
Denwerko

แม้ว่า / dev / สุ่มจะใช้เวลามากขึ้น
con-f-use

10
การใช้ / dev / สุ่มจะใช้เวลาอันยิ่งใหญ่มากของเวลา ใช้/dev/urandomในกรณีนั้น (ไม่ใช่การบล็อก แต่ไม่รับประกันว่าจะมีการสุ่มระดับเดียวกัน) การดึง 2 GB จากทั้งสองจะทำให้เอนโทรปีของระบบของคุณหมดลงอย่างสมบูรณ์ดังนั้นอย่าทำสิ่งเข้ารหัสลับเป็นเวลานานหลังจากนั้น
CVn

1

ftp://ftp.fsf.hu/testfiles/maketestfiles.sh

หรือ Seek คือขนาดของไฟล์ที่คุณต้องการในหน่วยไบต์ - 1

dd if=/dev/zero of=filename.big bs=1 count=1 seek=1048575 # 1 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=10485759 # 10 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=104857599 # 100 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=1073741823 # 1024 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=42949672959 # 40960 MByte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.