Crear un archivo de gran tamaño en menos tiempo

18

Quiero crear un archivo grande ~ 10G lleno de ceros y valores aleatorios. He intentado usar:

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

Crea un archivo de aproximadamente 2 Gb y sale con un estado de salida '0'. No entiendo por qué?

También intenté crear un archivo usando:

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

Se tarda unos 28-30 minutos en crearlo. Pero quiero que se cree más rápido. ¿Alguien tiene una solución?

También deseo crear múltiples archivos con el mismo patrón (pseudo) aleatorio para comparar. ¿Alguien sabe una manera de hacer eso?

skane
fuente
¡Bienvenido a AskUbuntu! Probablemente recibas un error dddebido al tamaño del bloque. Es posible que desee ver esta publicación stackoverflow.com/questions/6161823/ ... tiene algunas buenas respuestas sobre cómo calcular el mejor tamaño de bloque, así como algunos scripts / programas de usuario y otras sugerencias que se utilizan dd.
No Time
1
También eche un vistazo a stackoverflow.com/questions/257844/…
muru

Respuestas:

12

¿Qué tal si usamos Falocate? Esta herramienta nos permite preasignar espacio para un archivo (si el sistema de archivos admite esta función). Por ejemplo, asignando 5GB de datos a un archivo llamado 'ejemplo', uno puede hacer:

fallocate -l 5G example

Esto es mucho más rápido que dd, y asignará el espacio muy rápidamente.

Colin Ian King
fuente
¿Este archivo contiene datos aleatorios o contiene lo que sucedió en el espacio de disco asignado?
cprn
Contendrá todos los ceros. Básicamente, el espacio está preasignado, y si no modifica los datos, se supondrá que es cero.
Colin Ian King
¿Cómo puede ser esto más rápido que el dumping /dev/zero?
cprn
1
Es muy rápido porque es una llamada al sistema que bloquea la preasignación (p. Ej., Reserva el espacio pero hace un mínimo de E / S), mientras que dd'ing de / dev / zero a un archivo implica una carga de lectura / escritura.
Colin Ian King
Estoy subiendo este. Sin embargo, una última pregunta ... Estaba usando truncateen el pasado y descubrí que no asigna físicamente el archivo en el dispositivo y solo crea un archivo grande arbitrario hasta que se accede, independientemente del espacio disponible. ¿Estás seguro de que este no es el caso fallocate? Lo comprobaría pero estoy en un móvil ...
cprn
9

Puede utilizar ddpara crear un archivo que consta únicamente de ceros. Ejemplo:

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

Esto es muy rápido porque solo un byte está realmente escrito en el disco físico. Sin embargo, algunos sistemas de archivos no son compatibles con esto.

Si desea crear un archivo que contenga contenido pseudoaleatorio, ejecute:

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

Sugiero que use 10M como tamaño de búfer ( bs). Esto se debe a que 10M no es demasiado grande, pero aún así le da un buen tamaño de búfer. Debería ser bastante rápido, pero siempre depende de la velocidad del disco y la potencia de procesamiento.

xiaodongjie
fuente
1

Respondiendo la primera parte de tu pregunta:

Intentar escribir un búfer de 5 GB a la vez no es una buena idea, ya que su núcleo probablemente no lo admita. No le dará ningún beneficio de rendimiento en ningún caso. Escribir 1M a la vez es un buen máximo.

cprn
fuente
0

Esta pregunta se abrió hace 5 años. Me encontré con esto y quise agregar mis hallazgos.

Si simplemente usas

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

funcionará significativamente más rápido como lo explica xiaodongjie. Pero, puedes hacerlo aún más rápido usando eatmydatalike

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

Lo que eatmydatahace es deshabilitar fsync haciendo que el disco escriba más rápido.

Puede leer más al respecto en https://flamingspork.com/projects/libeatmydata/ .

GMishx
fuente
1
La forma en que lo veo ddes lo suficientemente rápida para empezar, y se llama libEAT-MY-DATA por alguna razón.
karel