Il est temps de compresser des fichiers très volumineux (100G)

Je me retrouve à devoir compresser un certain nombre de fichiers très volumineux (80 ish Go), et je suis surpris du (manque de) vitesse de mon système. J'obtiens une vitesse de conversion d'environ 500 Mo / min; en utilisant top, il me semble utiliser un seul processeur à environ 100%.

Je suis à peu près sûr que ce n'est pas (seulement) la vitesse d'accès au disque, car la création d'un fichier tar (c'est ainsi que le fichier 80G a été créé) n'a pris que quelques minutes (peut-être 5 ou 10), mais après plus de 2 heures, mon simple la commande gzip n'est toujours pas terminée.

En résumé :

tar -cvf myStuff.tar myDir/*

A pris <5 minutes pour créer un fichier tar 87 G

gzip myStuff.tar

A pris deux heures et 10 minutes, créant un fichier zip de 55 G.

Ma question : Est-ce normal? Y a-t-il certaines options dans gzip pour accélérer les choses? Serait-il plus rapide de concaténer les commandes et d'utiliser tar -cvfz ? J'ai vu une référence à pigz - Implémentation parallèle de GZip - mais malheureusement, je ne peux pas installer de logiciel sur la machine que j'utilise, ce n'est donc pas une option pour moi. Voir par exemple cette question antérieure .

J'ai l'intention d'essayer certaines de ces options moi-même et de les chronométrer - mais il est fort probable que je n'atteindrai pas "la combinaison magique" d'options. J'espère que quelqu'un sur ce site connaît la bonne astuce pour accélérer les choses.

Lorsque j'aurai les résultats d'autres essais disponibles, je mettrai à jour cette question - mais si quelqu'un a un truc particulièrement bon disponible, j'apprécierais vraiment il. Peut-être que le gzip prend juste plus de temps de traitement que je ne le pensais...

MISE À JOUR

Comme promis, j'ai essayé les astuces suggérées ci-dessous: changer la quantité de compression, et changer la destination du fichier. J'ai obtenu les résultats suivants pour un goudron d'environ 4,1 Go:

flag    user      system   size    sameDisk
-1     189.77s    13.64s  2.786G     +7.2s 
-2     197.20s    12.88s  2.776G     +3.4s
-3     207.03s    10.49s  2.739G     +1.2s
-4     223.28s    13.73s  2.735G     +0.9s
-5     237.79s     9.28s  2.704G     -0.4s
-6     271.69s    14.56s  2.700G     +1.4s
-7     307.70s    10.97s  2.699G     +0.9s
-8     528.66s    10.51s  2.698G     -6.3s
-9     722.61s    12.24s  2.698G     -4.0s

Donc oui, changer l'indicateur du -6 par défaut au -1 le plus rapide me donne une accélération de 30%, avec (pour mes données) pratiquement aucun changement à la taille du fichier zip. Si j'utilise le même disque ou un autre ne fait pratiquement aucune différence (je devrais l'exécuter plusieurs fois pour obtenir une signification statistique).

Si quelqu'un est intéressé, j'ai généré ces benchmarks de synchronisation en utilisant les deux scripts suivants:

#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile

for i in {1..9}
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done

Et le deuxième script (compressWith):

#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz

Trois choses à noter:

  1. En utilisant /usr/bin/time plutôt que time, car la commande intégrée de bash a beaucoup moins d'options que la commande GNU
  2. Je n'ai pas la peine d'utiliser l'option --format bien que cela rendrait le fichier journal plus facile à lire
  3. J'ai utilisé un script dans un script car time semblait fonctionner uniquement sur la première commande d'une séquence pipée (j'ai donc fait ressembler cela à une seule commande...).

Avec tout cela appris, mes conclusions sont

  1. Accélérez les choses avec le drapeau -1 (réponse acceptée)
  2. On passe beaucoup plus de temps à compresser les données qu'à lire à partir du disque
  3. Investissez plus vite logiciel de compression (pigz semble être un bon choix).
  4. Si vous avez plusieurs fichiers à compresser, vous pouvez placer chaque commande gzip dans son propre thread et utiliser davantage le processeur disponible (pauvre homme pigz)

Merci à tous ceux qui m'ont aidé à apprendre tout cela!

demandé sur