Je compresse normalement en utilisant tar zcvf
et décompresse en utilisant tar zxvf
(en utilisant gzip à cause de l'habitude).
J'ai récemment eu un processeur quad core avec hyperthreading, donc j'ai 8 cœurs logiques et je remarque que beaucoup de cœurs sont inutilisés pendant la compression/décompression.
Est-il possible d'utiliser les cœurs inutilisés pour accélérer le processus?
Vous pouvez utiliser pigz au lieu de gzip, qui effectue la compression gzip sur plusieurs cœurs. Au lieu d'utiliser l'option -z, vous la transmettriez via pigz:
tar cf - paths-to-archive | pigz > archive.tar.gz
Par défaut, pigz utilise le nombre de cœurs disponibles, ou huit s'il ne peut pas l'interroger. Vous pouvez demander plus avec -p n, par exemple. -p 32. pigz a les mêmes options que gzip, vous pouvez donc demander une meilleure compression avec -9. Par exemple.
tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Vous pouvez également utiliser l'indicateur tar "--use-compress-program =" pour indiquer à tar le programme de compression à utiliser.
Par exemple utiliser:
tar -c --use-compress-program=pigz -f tar.file dir_to_Zip
Il y a une option pour le programme tar
:
-I, --use-compress-program PROG
filter through PROG (must accept -d)
Vous pouvez utiliser la version multithread de l’utilitaire Archiver ou Compression.
Les archiveurs multithreads les plus populaires sont pigz (au lieu de gzip) et pbzip2 (au lieu de bzip2). Par exemple:
$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive
Archiveur doit accepter -d. Si votre utilitaire de remplacement n'a pas ce paramètre et/ou si vous avez besoin de spécifier des paramètres supplémentaires, utilisez des tuyaux (ajoutez des paramètres si nécessaire):
$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz
L'entrée et la sortie de singlethread et multithread sont compatibles. Vous pouvez compresser en utilisant la version multithread et décompresser en utilisant la version singlethread et vice versa.
Pour que p7Zip soit compressé, vous avez besoin d’un petit script Shell ressemblant à ceci:
#!/bin/sh
case $1 in
-d) 7za -txz -si -so e;;
*) 7za -txz -si -so a .;;
esac 2>/dev/null
Enregistrez-le sous 7zhelper.sh. Voici l'exemple d'utilisation:
$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z
En ce qui concerne le support XZ multithread. Si vous utilisez la version 5.2.0 ou ultérieure de XZ Utils, vous pouvez utiliser plusieurs cœurs pour la compression en définissant -T
ou --threads
sur une valeur appropriée via la variable d'environnement XZ_DEFAULTS (par exemple, XZ_DEFAULTS="-T 0"
).
Ceci est un fragment de man pour la version 5.1.0alpha:
La compression et la décompression multithread n'étant pas encore implémentées, cette option n'a aucun effet pour l'instant.
Cependant, cela ne fonctionnera pas pour la décompression de fichiers qui n'ont pas été compressés avec le threading activé. De l'homme pour la version 5.2.2:
La décompression par thread n'a pas encore été implémentée. Il ne fonctionnera que sur des fichiers contenant plusieurs blocs avec des informations de taille dans les en-têtes de bloc. Tous les fichiers compressés en mode multi-thread répondent à cette condition, mais les fichiers compressés en mode mono-thread ne le sont pas, même si --block-size = size est utilisé.
Si vous construisez tar à partir de sources, vous pouvez alors recompiler avec des paramètres
--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
Après avoir recompilé tar avec ces options, vous pouvez vérifier la sortie de l'aide de tar:
$ tar --help | grep "lbzip2\|plzip\|pigz"
-j, --bzip2 filter the archive through lbzip2
--lzip filter the archive through plzip
-z, --gzip, --gunzip, --ungzip filter the archive through pigz
Vous pouvez utiliser le raccourci -I
pour le commutateur --use-compress-program
de tar, et appeler pbzip2
pour la compression bzip2 sur plusieurs cœurs:
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
Si vous souhaitez plus de flexibilité avec les noms de fichiers et les options de compression, vous pouvez utiliser:
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz
find
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec
Cette commande recherchera les fichiers que vous souhaitez archiver, dans ce cas /my/path/*.sql
et /my/path/*.log
. Ajoutez autant de -o -name "pattern"
que vous le souhaitez.
-exec
exécutera la commande suivante en utilisant les résultats de find
: tar
tar
tar -P --transform='s@/my/path/@@g' -cf - {} +
--transform
est un paramètre de remplacement de chaîne simple. Il supprimera le chemin des fichiers de l'archive afin que la racine de l'archive devienne le répertoire actuel lors de l'extraction. Notez que vous ne pouvez pas utiliser l'option -C
pour changer de répertoire car vous perdriez les avantages de find
: tous les fichiers du répertoire seraient inclus.
-P
indique à tar
d'utiliser des chemins absolus pour ne pas déclencher l'avertissement "Suppression du`/'initial des noms de membre ". Le préfixe '/' est supprimé de toute façon par --transform
.
-cf -
dit à tar
d'utiliser le nom de l'archive que nous spécifierons plus tard
{} +
utilise tous les fichiers que find
trouvé précédemment
pigz
pigz -9 -p 4
Utilisez autant de paramètres que vous le souhaitez. Dans ce cas, -9
est le niveau de compression et -p 4
est le nombre de cœurs dédiés à la compression. Si vous l'exécutez sur un serveur Web chargé, vous ne souhaiterez probablement pas utiliser tous les cœurs disponibles.
> myarchive.tar.gz
Finalement.