Membuat file ukuran besar dalam waktu yang lebih singkat

18

Saya ingin membuat file besar ~ 10G diisi dengan nol dan nilai acak. Saya sudah mencoba menggunakan:

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

Itu membuat file sekitar 2Gb dan keluar dengan status keluar '0'. Saya gagal mengerti mengapa?

Saya juga mencoba membuat file menggunakan:

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

Dibutuhkan sekitar 28-30 menit untuk membuatnya. Tapi saya ingin ini dibuat lebih cepat. Adakah yang punya solusi?

Saya juga ingin membuat beberapa file dengan pola acak yang sama (pseudo) untuk perbandingan. Adakah yang tahu cara untuk melakukan itu?

skane
sumber
Selamat datang di AskUbuntu! Anda mungkin mendapatkan kesalahan ddkarena ukuran blok. Anda mungkin ingin melihat posting ini stackoverflow.com/questions/6161823/... ia memiliki beberapa jawaban yang bagus bagaimana menghitung ukuran blok terbaik, serta beberapa skrip / program pengguna, dan saran lain yang digunakan dd.
No Time

Jawaban:

12

Bagaimana dengan menggunakan fallocate, alat ini memungkinkan kita untuk melakukan pra-alokasi ruang untuk suatu file (jika filesystem mendukung fitur ini). Misalnya, mengalokasikan 5GB data ke file yang disebut 'contoh', seseorang dapat melakukannya:

fallocate -l 5G example

Ini jauh lebih cepat daripada dd, dan akan mengalokasikan ruang dengan sangat cepat.

Colin Ian King
sumber
Apakah file ini berisi data acak atau apakah itu berisi apa pun yang terjadi pada ruang disk yang dialokasikan?
cprn
Ini akan berisi semua nol. Pada dasarnya, ruang dialokasikan sebelumnya, dan jika Anda tidak mengubah data itu akan dianggap nol.
Colin Ian King
Bagaimana ini bisa lebih cepat daripada membuangnya /dev/zero?
cprn
1
Ini sangat cepat karena ini adalah satu pemanggilan sistem yang tidak memblokir pra-alokasi (mis., Itu menghemat ruang tetapi I / O minimal), di mana ketika melakukan dari / dev / nol ke sebuah file melibatkan beban baca / tulis.
Colin Ian King
Saya siapkan yang ini. Namun satu pertanyaan terakhir ... Saya menggunakan truncatedi masa lalu dan menemukan itu tidak secara fisik mengalokasikan file pada perangkat dan hanya membuat file besar yang sewenang-wenang sampai diakses, terlepas dari ruang yang tersedia. Apakah Anda yakin ini bukan masalahnya fallocate? Saya akan memeriksanya tetapi saya menggunakan ponsel ...
cprn
9

Anda dapat menggunakan dduntuk membuat file yang hanya terdiri dari nol. Contoh:

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

Ini sangat cepat karena hanya satu byte yang benar-benar ditulis ke disk fisik. Namun, beberapa sistem file tidak mendukung ini.

Jika Anda ingin membuat file yang berisi konten pseudo-acak, jalankan:

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

Saya sarankan Anda menggunakan 10M sebagai ukuran buffer ( bs). Ini karena 10M tidak terlalu besar, tetapi masih memberi Anda ukuran buffer yang baik. Ini seharusnya cukup cepat, tetapi selalu tergantung pada kecepatan disk dan daya pemrosesan Anda.

Xiaodongjie
sumber
1

Menjawab bagian pertama dari pertanyaan Anda:

Mencoba menulis buffer 5GB pada suatu waktu bukanlah ide yang baik karena kernel Anda mungkin tidak mendukungnya. Bagaimanapun, itu tidak akan memberi Anda manfaat kinerja. Menulis 1 jt sekaligus adalah maksimum yang baik.

cprn
sumber
0

Pertanyaan ini dibuka 5 tahun yang lalu. Saya hanya menemukan ini dan ingin menambahkan temuan saya.

Jika Anda hanya menggunakan

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

itu akan bekerja lebih cepat secara signifikan seperti yang dijelaskan oleh xiaodongjie. Tapi, Anda bisa membuatnya lebih cepat dengan menggunakan eatmydatalike

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

Apa yang eatmydatadilakukannya adalah menonaktifkan fsync membuat disk menulis lebih cepat.

Anda dapat membaca lebih lanjut tentang hal ini di https://flamingspork.com/projects/libeatmydata/ .

GMishx
sumber
1
Cara saya melihatnya ddcukup cepat untuk memulai, dan itu disebut libEAT-MY-DATA karena suatu alasan.
karel