Créer un fichier de grande taille en moins de temps

18

Je veux créer un gros fichier ~ 10G rempli de zéros et de valeurs aléatoires. J'ai essayé d'utiliser:

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

Il crée un fichier d'environ 2 Go et se termine avec un état de sortie «0». Je n'arrive pas à comprendre pourquoi?

J'ai également essayé de créer un fichier en utilisant:

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

Il faut environ 28-30 minutes pour le créer. Mais je veux qu'il soit créé plus rapidement. Quelqu'un a une solution?

Je souhaite également créer plusieurs fichiers avec le même motif (pseudo) aléatoire pour comparaison. Quelqu'un sait-il comment faire cela?

skane
la source
Bienvenue sur AskUbuntu! Vous obtenez probablement une erreur en ddraison de la taille du bloc. Vous voudrez peut-être regarder ce post stackoverflow.com/questions/6161823/… il a de bonnes réponses sur la façon de calculer la meilleure taille de bloc, ainsi que certains scripts / programmes utilisateur et d'autres suggestions à l'aide dd.
Pas de temps
1
Jetez également un œil à stackoverflow.com/questions/257844/…
muru

Réponses:

12

Que diriez-vous d'utiliser fallocate, cet outil nous permet de préallouer de l'espace pour un fichier (si le système de fichiers prend en charge cette fonctionnalité). Par exemple, en allouant 5 Go de données à un fichier appelé «exemple», on peut faire:

fallocate -l 5G example

Ceci est beaucoup plus rapide que dd et allouera l'espace très rapidement.

Colin Ian King
la source
Ce fichier contient-il des données aléatoires ou contient-il tout ce qui se trouvait sur l'espace disque alloué?
cprn
Il contiendra tous les zéros. Fondamentalement, l'espace est préalloué, et si vous ne modifiez pas les données, il sera présumé être nul.
Colin Ian King du
Comment cela peut-il être plus rapide que le dumping /dev/zeroalors?
cprn
1
C'est très rapide car c'est un appel système qui bloque la pré-allocation (par exemple, il réserve de l'espace mais fait un minimum d'E / S), alors que le fait de passer de / dev / zero à un fichier implique une charge de lecture / écriture.
Colin Ian King du
Je monte celui-ci. Une dernière question cependant ... J'utilisais truncatedans le passé et j'ai découvert qu'il n'allouait pas physiquement le fichier sur l'appareil et créait juste un fichier arbitraire de grande taille jusqu'à ce qu'il soit accédé, quel que soit l'espace disponible. Êtes-vous sûr que ce n'est pas le cas fallocate? Je le vérifierais mais je suis sur un mobile ...
cprn
9

Vous pouvez utiliser ddpour créer un fichier composé uniquement de zéros. Exemple:

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

C'est très rapide car un seul octet est réellement écrit sur le disque physique. Cependant, certains systèmes de fichiers ne le prennent pas en charge.

Si vous souhaitez créer un fichier contenant un contenu pseudo-aléatoire, exécutez:

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

Je vous suggère d'utiliser 10M comme taille de tampon ( bs). C'est parce que 10M n'est pas trop grand, mais il vous donne toujours une bonne taille de tampon. Cela devrait être assez rapide, mais cela dépend toujours de la vitesse de votre disque et de la puissance de traitement.

xiaodongjie
la source
1

Répondre à la première partie de votre question:

Essayer d'écrire un tampon de 5 Go à la fois n'est pas une bonne idée car votre noyau ne le supporte probablement pas. Cela ne vous procurera aucun avantage en termes de performances. Écrire 1M à la fois est un bon maximum.

cprn
la source
0

Cette question a été ouverte il y a 5 ans. Je suis juste tombé sur cela et je voulais ajouter mes conclusions.

Si vous utilisez simplement

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

cela fonctionnera beaucoup plus rapidement comme expliqué par xiaodongjie. Mais, vous pouvez le rendre encore plus rapide en utilisant eatmydatacomme

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

Qu'est eatmydata- ce que c'est, il désactive fsync pour accélérer l'écriture du disque.

Vous pouvez en savoir plus à ce sujet sur https://flamingspork.com/projects/libeatmydata/ .

GMishx
la source
1
La façon dont je le vois ddest assez rapide pour commencer, et cela s'appelle libEAT-MY-DATA pour une raison.
karel