การสร้างไฟล์ขนาดใหญ่ในเวลาอันสั้น


18

ฉันต้องการสร้างไฟล์ขนาดใหญ่ ~ 10G ที่เต็มไปด้วยเลขศูนย์และค่าสุ่ม ฉันได้ลองใช้:

dd if=/dev/urandom of=10Gfile bs=5G count=10

มันสร้างไฟล์ประมาณ 2Gb และออกด้วยสถานะออก '0' ฉันไม่เข้าใจว่าทำไม

ฉันพยายามสร้างไฟล์โดยใช้:

head -c 10G </dev/urandom >myfile

ใช้เวลาในการสร้างประมาณ 28-30 นาที แต่ฉันต้องการให้มันสร้างเร็วขึ้น ใครมีทางออก?

ฉันต้องการสร้างหลายไฟล์ด้วยแพทเทิร์นแบบสุ่ม (หลอก) เพื่อเปรียบเทียบ ไม่มีใครรู้วิธีการทำเช่นนั้น?


ยินดีต้อนรับสู่ AskUbuntu! คุณอาจได้รับข้อผิดพลาดddเนื่องจากขนาดบล็อก คุณอาจต้องการที่จะมองไปที่โพสต์นี้stackoverflow.com/questions/6161823/...มันมีคำตอบที่ดีบางอย่างวิธีการคำนวณขนาดที่เหมาะสมที่สุดบล็อกเช่นเดียวกับบางสคริปต์ผู้ใช้ / โปรแกรมและข้อเสนอแนะอื่น ๆ ddที่ใช้
ไม่มีเวลา

1
นอกจากนี้ยังดูได้ที่stackoverflow.com/questions/257844/…
muru

คำตอบ:


12

วิธีการใช้ fallocate เครื่องมือนี้ช่วยให้เราสามารถจัดสรรพื้นที่สำหรับไฟล์ได้ล่วงหน้า (หากระบบไฟล์รองรับคุณสมบัตินี้) ตัวอย่างเช่นการจัดสรร 5GB ของข้อมูลไปยังไฟล์ที่เรียกว่า 'ตัวอย่าง' หนึ่งสามารถทำได้:

fallocate -l 5G example

นี่คือเร็วกว่าววและจะจัดสรรพื้นที่อย่างรวดเร็วมาก


ไฟล์นี้มีข้อมูลแบบสุ่มหรือมีสิ่งใดเกิดขึ้นในพื้นที่ดิสก์ที่จัดสรรหรือไม่
cprn

มันจะมีศูนย์ทั้งหมด โดยทั่วไปพื้นที่จะถูกจัดสรรล่วงหน้าและหากคุณไม่ได้แก้ไขข้อมูลมันจะถูกสันนิษฐานว่าเป็นศูนย์
โคลินเอียนคิง

วิธีนี้จะเร็วกว่าการทิ้ง/dev/zeroแล้ว
cprn

1
มันเร็วมากเพราะเป็นหนึ่งการเรียกของระบบซึ่งทำการบล็อกการจัดสรรล่วงหน้า (เช่นจองพื้นที่ แต่ทำ I / O ให้น้อยที่สุด) โดยที่ dd'ing จาก / dev / zero ไปยังไฟล์เกี่ยวข้องกับโหลดอ่าน / เขียน
โคลินเอียนคิง

ฉันกำลังเติมอันนี้ หนึ่งคำถามสุดท้ายแม้ว่า ... ฉันเคยใช้truncateมาแล้วและพบว่ามันไม่ได้ทำการจัดสรรไฟล์บนอุปกรณ์และเพิ่งสร้างไฟล์ขนาดใหญ่ตามอำเภอใจจนกระทั่งเข้าถึงได้ไม่ว่าจะมีพื้นที่ว่างเท่าใด คุณแน่ใจว่ากรณีนี้ไม่ได้ด้วยfallocate? ฉันจะตรวจสอบ แต่ฉันบนมือถือ ...
cprn

9

คุณสามารถใช้ddเพื่อสร้างไฟล์ที่ประกอบด้วยศูนย์ ตัวอย่าง:

dd if=/dev/zero of=zeros.img count=1 bs=1 seek=$((10 * 1024 * 1024 * 1024 - 1))

สิ่งนี้เร็วมากเพราะมีเพียงหนึ่งไบต์เท่านั้นที่เขียนลงดิสก์จริง อย่างไรก็ตามระบบไฟล์บางระบบไม่รองรับสิ่งนี้

หากคุณต้องการสร้างไฟล์ที่มีเนื้อหาแบบหลอกหลอกให้รัน:

dd if=/dev/urandom of=random.img count=1024 bs=10M

ฉันขอแนะนำให้คุณใช้ 10M เป็นขนาดบัฟเฟอร์ ( bs) นี่เป็นเพราะ 10M ไม่ใหญ่เกินไป แต่ก็ยังให้ขนาดบัฟเฟอร์ที่ดี มันควรจะค่อนข้างเร็ว แต่มันก็ขึ้นอยู่กับความเร็วของดิสก์และพลังในการประมวลผลเสมอ


5

การใช้ dd ควรสร้างไฟล์ 10 GB ที่เต็มไปด้วยข้อมูลแบบสุ่ม:

dd if=/dev/urandom of=test1 bs=1M count=10240

count เป็นหน่วยเมกะไบต์

ที่มา: stackoverflow - วิธีสร้างไฟล์ที่มีขนาดที่กำหนดใน Linux?


ฉันเพิ่งลองdd if=/dev/urandom of=10Gfile bs=500M count=20ซึ่งให้ 10237226010 ไบต์ในเวลาไม่ถึง 20 นาที
Jos

1

ตอบคำถามแรกของคุณ:

การพยายามเขียนบัฟเฟอร์ครั้งละ 5GB ไม่ใช่ความคิดที่ดีเพราะเคอร์เนลของคุณอาจไม่รองรับสิ่งนั้น มันจะไม่ให้ประโยชน์ด้านประสิทธิภาพใด ๆ แก่คุณในทุกกรณี การเขียนครั้งละ 1M เป็นค่าที่ดีที่สุด


0

คำถามนี้เปิดเมื่อ 5 ปีที่ผ่านมา ฉันเพิ่งพบสิ่งนี้และต้องการเพิ่มสิ่งที่ค้นพบของฉัน

ถ้าคุณใช้เพียง

dd if=/dev/urandom of=random.img count=1024 bs=10M

มันจะทำงานได้เร็วขึ้นอย่างมีนัยสำคัญตามที่อธิบายโดย xiaodongjie แต่คุณสามารถทำให้เร็วขึ้นได้โดยใช้eatmydataไลค์

eatmydata dd if=/dev/urandom of=random.img count=1024 bs=10M

สิ่งที่eatmydataไม่สามารถจะปิดการใช้งาน fsync ทำให้การเขียนแผ่นดิสก์ได้เร็วขึ้น

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่https://flamingspork.com/projects/libeatmydata/


1
วิธีที่ฉันดูมันddเร็วพอที่จะเริ่มต้นด้วยและมันถูกเรียกว่า libEAT-MY-DATA ด้วยเหตุผล
karel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.