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.