Quel est le meilleur moyen d'utiliser parallèlement bzip2 et gzip par défaut?

41

Bzip2 et gzip n’utilisent qu’un seul cœur, bien que de nombreux ordinateurs disposent de plus d’un cœur. Mais il existe des programmes tels que lbzip2, pbzip2 et pigz, qui utilisent tous les cœurs disponibles et promettent d'être compatibles avec bzip2 et gzip.

Alors, quelle est la meilleure façon d'utiliser ces programmes par défaut, de sorte que l'on tar cfa file.tar.bz2 directoryutilise lbzip2 / pbzip2 au lieu de bzip2? Bien sûr, je ne veux rien casser.

Elmicha
la source
2
Par curiosité pour tous: le mode parallèle gzip / bzip est-il vraiment plus rapide que le mode série? J'imagine que la vitesse d'écriture du disque dur et d'autres restrictions sont plus problématiques.
con-f-use
@ con-f-use Non, sauf si vous avez des disques SSD en théorie, cela pourrait être plus rapide si la taille totale de l'archive augmente.
Marco Ceppi
1
Sur un système de 16 cpus, le passage de gzip à pigz a permis de réduire le temps de traitement à 1,2 To et de le transférer sur le réseau et de tester le résultat de 18 heures de sauvegarde et 14 heures de test à 4 heures de sauvegarde et 2 heures de test. Il existe de nombreux goulots d'étranglement potentiels, la vitesse du disque, le réseau, la puissance de traitement, mais dans ce cas, cela était définitivement plus lié au cpu qu'à IO. Ceci est un système haut de gamme, vos résultats peuvent varier. Ce n'était pas important, mais c'était sur RHEL6
cs_alumnus

Réponses:

32

Vous pouvez relier symboliquement bzip2, bunzip2 et bzcat à lbzip2, et gzip, gunzip, gzcat et zcat à pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

J'ai choisi lbzip2 au lieu de pbzip2 car /usr/share/doc/lbzip2/README.gz est plus "joli" que /usr/share/doc/pbzip2/README.gz. En outre, le manuel tar parle de lbzip2 .

Modifier:

pigz-2.1.6, inclus dans Precise Pangolin, refuse de décompresser les fichiers avec des suffixes inconnus (par exemple, initramfs - *. img). Ceci est corrigé dans pigz-2.2.4, qui est livré avec Quantal. Donc, vous voudrez peut-être attendre jusqu'à Quantal, installer manuellement le paquet Quantal ou ne pas encore lier gunzip / gzcat / zcat.

Elmicha
la source
7
Cela fonctionne bien parce que / usr / local / bin / précède / bin / dans la variable $ PATH de la plupart des gens. Si quelque chose appelle directement / bin / gunzip ou si quelqu'un a / bin en premier dans leur $ PATH, ils n'utiliseront pas pigz. Pour que cela fonctionne aussi pour eux, vous pouvez utiliser dpk-divert et faire quelque chose comme cela pour tous les fichiers binaires, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipmais il est possible que pigz ne soit pas compatible à 100% avec tous les indicateurs gzip, soyez donc prudent.
Mark McKinstry
31

L'idée de lien symbolique est vraiment bien.
Une autre solution de travail consiste à alias tar:

alias tar='tar --use-compress-program=pbzip2'

ou respectivement

alias tar='tar --use-compress-program=pigz'

Cela crée un autre type de défaut.

Bastian Ebeling
la source
avantage supplémentaire: vous pouvez utiliser un alias tel que 'partar' si vous souhaitez conserver la fonctionnalité d'origine (pour une raison quelconque). Malheureusement, 'ptar' est pris en charge par perl
jena 10/03/17
13

La réponse au lien symbolique est vraiment incorrecte. Il remplacerait le défaut gzip (ou bzip2) par pigz (ou pbzip2) pour l’ensemble du système. Bien que les implémentations parallèles soient remarquablement similaires aux versions à processus uniques, des différences subtiles dans les options de ligne de commande pourraient briser les processus système fondamentaux qui dépendent de ces différences.

L'option "--use-compress-programme" est un bien meilleur choix. Une deuxième option (un peu comme l'alias) serait de définir la variable d'environnement TAR_OPTIONS supportée par GNU tar:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf monfichier.tar.bz2 mysubdir /
utilisateur154053
la source
6
J'utilise les liens symboliques depuis 2011 et je n'ai pas vu de casse (à l'exception du cas mentionné dans l'édition). Et si de telles différences subtiles ne sont pas trouvées et signalées, nous serons bloqués avec des versions non parallèles pour toujours. Si vous utilisez TAR_OPTIONS = "- use-compress-program = pbzip2", il ne semble pas que vous puissiez différencier bzip2 de gzip.
Elmicha
Cela n'a pas fonctionné pour moi.
Derek Perkins
3

Une option fascinante consiste à recompiler tar pour utiliser multithread par défaut. Copié à partir de cette réponse stackoverflow

Recompiler avec remplacement

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
Tom Koch
la source
-2

Utilisez dans vos ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
foo bar
la source
1
Cela ne fonctionnera que si vous appelez le programme gzip(ou gunzip) directement sur la ligne de commande du shell. tarCela n'affectera pas les autres programmes (comme ).
Christian Hudon