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:
- En utilisant
/usr/bin/time
plutôt quetime
, car la commande intégrée debash
a beaucoup moins d'options que la commande GNU - Je n'ai pas la peine d'utiliser l'option
--format
bien que cela rendrait le fichier journal plus facile à lire - 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
- Accélérez les choses avec le drapeau
-1
(réponse acceptée) - On passe beaucoup plus de temps à compresser les données qu'à lire à partir du disque
- Investissez plus vite logiciel de compression (
pigz
semble être un bon choix). - Si vous avez plusieurs fichiers à compresser, vous pouvez placer chaque commande
gzip
dans son propre thread et utiliser davantage le processeur disponible (pauvre hommepigz
)
Merci à tous ceux qui m'ont aidé à apprendre tout cela!