Qual è il modo migliore per usare parallelamente bzip2 e gzip per impostazione predefinita?


41

Bzip2 e gzip usano solo un core, anche se molti computer hanno più di un core. Ma ci sono programmi come lbzip2, pbzip2 e pigz, che usano tutti i core disponibili e promettono di essere compatibili con bzip2 e gzip.

Quindi qual è il modo migliore per usare questi programmi di default, in modo che tar cfa file.tar.bz2 directoryusi lbzip2 / pbzip2 invece di bzip2? Ovviamente non voglio rompere nulla.


2
Per curiosità a tutti: il gzip / bzip parallelo è davvero più veloce del seriale? Immagino che la velocità di scrittura dell'hdd e altre restrizioni siano più un problema.
con-f-use

@ con-f-use A meno che non abbiate teoricamente SSD, potrebbe essere più veloce all'aumentare della dimensione totale dell'archivio.
Marco Ceppi

1
Su un sistema con 16 cpus, il passaggio da gzip a pigz ha ridotto il tempo a tar 1,2 TB e trasferito in rete e testato il risultato da 18 ore di backup e 14 ore di test a 4 ore di backup e 2 ore di test. Ci sono molti potenziali colli di bottiglia, velocità del disco, velocità della rete, potenza di elaborazione, ma in questo caso questo è stato sicuramente associato più che a IO. Questo è un sistema di fascia alta, i risultati possono variare. Non è importante, ma questo è stato su RHEL6
cs_alumnus il

Risposte:


32

Puoi collegare simbolicamente bzip2, bunzip2 e bzcat a lbzip2 e gzip, gunzip, gzcat e zcat a 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

Ho scelto lbzip2 invece di pbzip2 perché /usr/share/doc/lbzip2/README.gz sembra "più bello" di /usr/share/doc/pbzip2/README.gz. Inoltre, il manuale tar parla di lbzip2 .

Modificare:

pigz-2.1.6, incluso in Precise Pangolin, si rifiuta di decomprimere i file con suffissi sconosciuti (ad es. initramfs - *. img). Questo problema è stato risolto in pigz-2.2.4, fornito con Quantal. Quindi potresti voler aspettare fino a Quantal, installare manualmente il pacchetto Quantal o non collegare ancora gunzip / gzcat / zcat.


7
Funziona bene perché / usr / local / bin / viene prima di / bin / nel $ PATH della maggior parte delle persone. Se qualcosa chiama / bin / gunzip direttamente o qualcuno ha / bin per primo nel proprio $ PATH, non useranno pigz. Per farlo funzionare anche per loro, puoi usare dpk-divert e fare qualcosa del genere per tutti i file binari, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipma c'è la possibilità che pigz non sia compatibile al 100% con tutti i flag gzip, quindi fai attenzione.
Mark McKinstry,

31

L'idea del collegamento simbolico è davvero ottima.
Un'altra soluzione funzionante è l'alias tar:

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

o rispettivamente

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

Crea un altro tipo di default.


vantaggio aggiunto: puoi usare un alias come 'partar' se vuoi preservare la funzionalità originale (per qualche ragione) .. purtroppo 'ptar' è preso dall'implementazione del perl
jena

13

La risposta del link simbolico è davvero errata. Sostituirebbe gzip (o bzip2) predefinito con pigz (o pbzip2) per l'intero sistema. Mentre le implementazioni parallele sono notevolmente simili alle versioni a singolo processo, sottili differenze nelle opzioni della riga di comando potrebbero interrompere i processi di sistema di base che dipendono da tali differenze.

L'opzione "--use-compress-program" è una scelta molto migliore. Una seconda opzione (molto simile all'alias) sarebbe quella di impostare la variabile d'ambiente TAR_OPTIONS supportata da tar GNU:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
Uso i link simbolici dal 2011 e non ho riscontrato alcuna rottura (a parte il caso menzionato nella modifica). E se tali sottili differenze non vengono rilevate e riportate, resteremo bloccati per sempre con versioni non parallele. Se usi TAR_OPTIONS = "- use-compress-program = pbzip2" non sembra che tu possa distinguere tra bzip2 e gzip.
elmicha,

Questo non ha funzionato per me.
Derek Perkins,

3

Un'opzione affascinante è quella di ricompilare tar per usare il multithread di default. Copiato da questa risposta StackOverflow

Ricompilazione con sostituzione

Se si crea tar da fonti, è possibile ricompilare con i parametri

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Dopo aver ricompilato tar con queste opzioni è possibile controllare l'output della guida di 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

-2

Usa nei tuoi ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"

1
Funzionerà solo quando si chiama il gzip(o gunzip) programma direttamente dalla riga di comando della shell. Altri programmi (come tar) non ne saranno influenzati.
Christian Hudon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.