Calculez combien d'espace disque aurait été utilisé

25

Existe-t-il sous Linux un programme capable de calculer la quantité de données qu'un programme produirait?

Par exemple, si je voudrais faire une sauvegarde de ma base de données MySQL, je le ferais habituellement

mysqldump > dumpfile.sql

Au lieu de cela, je voudrais rediriger vers, /dev/nullmais calculer combien d'espace disque aurait été utilisé, comme

mysqldump | fancy_space_calc_program

Sortie:

123456789 Bytes would have been used

Notez que la sauvegarde MySQL n'est qu'un exemple. Je suis très bien conscient de la façon dont je pourrais estimer la taille à l'avance, alors veuillez ne pas faire de commentaires à ce sujet.

fancyPants
la source
1
Je ne pense même pas que vous puissiez vraiment en faire un; pour des cas spécifiques oui, mais pas pour une utilisation générale, car comment pouvez-vous estimer si une application appelle un serveur et télécharge des données à partir de là - aucune chance que vous puissiez estimer de telles choses dans des applications étrangères. Ce serait donc par application - comme vous écrivez que vous connaissez déjà pour MYSQL - aucune explication là-bas, mais pour d'autres applications - par application, aucun outil général ne pourrait faire une telle prédiction correctement.
Drako
1
J'espère que vous vous rendez compte que toute tentative d'estimation nécessiterait d'exécuter le programme et d'observer la sortie pendant son envoi dans un endroit sûr. Cela va être impossible si le programme a une sorte d'effet irréversible sur autre chose, vous ne pouvez donc l'exécuter qu'une seule fois sans effets secondaires involontaires. L'autre problème est que si le programme dérive sa sortie d'une entrée changeante, la prochaine exécution va créer un autre fichier de sortie (de taille différente). Dernier point mais non le moindre: espace disque <> (octets de sortie). Et divers systèmes de fichiers ont des frais généraux différents pour la comptabilité.
Tonny
1
Oui, j'en suis bien conscient. C'est encore assez bon pour moi.
fancyPants
@Drako Vous pouvez avoir une manière générale de mesurer la sortie texte d'un programme. Cela n'a pas besoin d'être par application (voir par exemple la réponse acceptée). Le fait que la sortie de texte soit ou non identique de manière fiable lors des exécutions suivantes est spécifique à l'application, mais cela ne vous empêche pas de mesurer la sortie de manière générale. On peut supposer que l'OP et toute autre personne essayant de mesurer la sortie ne le feraient que si les données étaient significatives pour une application donnée.
Jon Bentley
@JonBentley Je ne vous ai jamais dit que vous ne pouviez pas l'avoir, lisez plus attentivement: "comme je l'ai écrit, la prédiction générale ne sera pas précise ou même proche :)" et imaginez maintenant que mon application après l'exécution vérifiera les mises à jour de lui-même, des plugins , etc. et téléchargera x quantité de données depuis i-net et les stockera sur votre disque dur; comment vous allez mesurer avec précision à l'avance avec un outil général ne sachant rien de mon application, combien d'espace de stockage sera nécessaire après l'avoir exécutée? Vous pouvez toujours faire votre meilleure supposition avec une réponse acceptée et dans de nombreux cas, même être assez précis.
Drako

Réponses:

37

Tiré de /programming/13418688/use-pipe-with-du-to-compute-size-of-stdin

Vous pouvez le diriger vers wc -cpour compter le nombre d'octets qui passent par le pipeline.

Bien sûr, ce ne sont que les octets bruts, et n'ont rien à voir avec la taille du secteur, etc., alors prenez-le avec un grain de sel ...

Magnus
la source
comme j'ai écrit la prédiction générale ne va pas être précise ni même proche :)
Drako
6
@cat une bonne implémentation de wcva supprimer les données dont il n'a plus besoin dès que possible.
Ruslan
2
@cat Je pense qu'il est peu probable qu'il soit mis en mémoire tampon, car vous n'avez pas besoin de mettre en mémoire tampon pour compter les lignes ou les caractères. GNU coreutils wcsur mon ordinateur gère facilement 40 Go de données stdin, avec seulement 8 Go de mémoire.
Frxstrem
8
@Magnus. Je pense que vous avez manqué le jeu de mots. WC est un terme britannique pour ce que les Américains appellent une salle de bain. Vous canalisez les données inutilisées dans le WC.
Fund Monica's Lawsuit
3
Vous @Frxstrem certainement faire tampon besoin de compter des lignes ou des caractères - dès que vous ne travaillez plus avec un codage isomorphe. Depuis POSIX.2, wc -cne compte pas les caractères - il compte les octets. wc -mcompte les caractères. La différence la plus évidente est dans les caractères multi-octets comme dans UTF-16 ou Windows \r\n(deux octets en ASCII, mais un caractère). Il n'a pas nécessairement besoin de beaucoup de mise en mémoire tampon la plupart du temps, mais Unicode peut avoir une quantité arbitraire d'octets pour représenter un seul caractère; pas quelque chose que vous verriez dans les données fiables, mais un vecteur de débordement de tampon possible.
Luaan
28

La commande pv est parfaite pour cela.

mysqldump | pv -b > /dev/null

Je pense que ce qui précède vous donnera la bonne commande que vous voulez, il faudra peut-être un ajustement tel pv -b | > /dev/nullque je ne peux pas le tester pour le moment

-b vous donne une valeur en octets.

djsmiley2k - CoW
la source
1
Saint, j'ai oublié pv ainsi que wc. Honte sur moi. J'aimerais accepter les deux réponses. Donc, désolé, mais Magnus était un peu plus rapide et il peut utiliser la réputation.
fancyPants
Ouais pas de soucis, le truc wc est vraiment sympa, je ne sais pas pourquoi cela ne m'est pas immédiatement venu à l'esprit. Je suis d'abord allé au bar! puis réalisé ce que je voulais dire était pv! :)
djsmiley2k - CoW
Et maintenant, vous me demandez de saisir le descripteur de fichier et de vérifier une taille dans / proc quelque part ....
djsmiley2k - CoW
2
Je n'en ai jamais entendu parler pvavant .. Vous apprenez quelque chose de nouveau chaque jour :)
Magnus
2
@Magnus: Je pense que wc est plus ancien (une partie de certains systèmes Unix plus anciens), pas dans autant de documentation, et (très probablement en conséquence) pv est pré-installé dans moins de distributions. C'est quand même agréable à savoir. Voir cette belle image conceptuelle qui provient de la page d'accueil du programme "pv" ("pipe viewer")
TOOGAM
0

Vous pouvez l'utiliser ddpour cela, comme ça cat /dev/zero | dd status=progress of=/dev/null bs=4M.

Cela vous fournit des données pendant et après l'exécution sur la quantité de données qui lui sont transmises, comme:

$ cat /dev/zero | dd status=progress of=/dev/null                                                                                                                              
5371334656 bytes (5.4 GB, 5.0 GiB) copied, 4 s, 1.3 GB/s^C # this is progress data
12271136+0 records in #summary
12271135+0 records out #summary
6282821120 bytes (6.3 GB, 5.9 GiB) copied, 4.66683 s, 1.3 GB/s #summary
mouche en polystyrène
la source