Quali strumenti di compressione sono disponibili in Ubuntu che possono beneficiare di una CPU multi-core.
Quali strumenti di compressione sono disponibili in Ubuntu che possono beneficiare di una CPU multi-core.
Risposte:
Esistono due strumenti principali. lbzip2
e pbzip2
. Sono essenzialmente diverse implementazioni dei compressori bzip2. Li ho confrontati (l'output è una versione riordinata ma dovresti essere in grado di eseguire i comandi)
cd /dev/shm # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400
$ lbzip2 -zk bigfile
Time: 0m3.596s
Size: 105335428
$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460
lbzip2
sembra essere il vincitore di dati casuali. È leggermente meno compresso ma molto più veloce. YMMV.
/dev/urandom
non è un'ottima scelta di input per l'analisi comparativa degli strumenti di compressione, poiché i dati casuali sono, per definizione, incomprimibili. Ciò spiega in parte perché in entrambi i casi il file di output è ~ 450 MiB più grande dell'input.
00000000000000000000000000000000
. Ecco come funziona a caso;) Di cosa stai parlando sono le medie pratiche. È improbabile che generi un file da 100 MB di soli zeri. E sono d'accordo con lo spirito di ciò che stai dicendo, semplicemente non sono d'accordo con il "per definizione" perché non è questa la definizione (perché non è precisa).
wget http://mattmahoney.net/dc/enwik8.zip
per catturare 96 MB (21 MB compressi) di testo da Wikipedia. Per una suite di benchmark molto più completa, vedere qui .
Bene, la parola chiave era parallela . Dopo aver cercato tutti gli strumenti di compressione che erano anche paralleli, ho trovato quanto segue:
PXZ - Parallel XZ è un'utilità di compressione che sfrutta l'esecuzione della compressione LZMA di diverse parti di un file di input su più core e processori contemporaneamente. Il suo obiettivo principale è quello di utilizzare tutte le risorse per accelerare i tempi di compressione con la minima influenza possibile sul rapporto di compressione.
sudo apt-get install pxz
PLZIP - Lzip è un compressore di dati senza perdita di dati basato sull'algoritmo LZMA, con un controllo dell'integrità molto sicuro e un'interfaccia utente simile a quella di gzip o bzip2. Lzip si decomprime quasi quanto gzip e comprime meglio di bzip2, il che lo rende adatto alla distribuzione di software e all'archiviazione dei dati.
Plzip è una versione massicciamente parallela (multi-thread) di lzip usando il formato file lzip; i file prodotti da plzip sono pienamente compatibili con lzip.
Plzip è progettato per una compressione / decompressione più rapida di file di grandi dimensioni su macchine multiprocessore, il che lo rende particolarmente adatto per la distribuzione di file di software di grandi dimensioni e l'archiviazione di dati su larga scala. Su file abbastanza grandi, plzip può usare centinaia di processori.
sudo apt-get install plzip
PIGZ - pigz, che sta per Implementazione parallela di GZip, è un sostituto completamente funzionale di gzip che sfrutta più processori e più core durante la compressione dei dati.
sudo apt-get install pigz
PBZIP2 - pbzip2 è un'implementazione parallela del compressore di file di ordinamento a blocchi bzip2 che utilizza pthreads e raggiunge una velocità quasi lineare sulle macchine SMP. L'output di questa versione è pienamente compatibile con bzip2 v1.0.2 (ovvero: qualsiasi cosa compresso con pbzip2 può essere decompresso con bzip2).
sudo apt-get install pbzip2
LRZIP - Un programma di compressione multithread che può raggiungere rapporti e velocità di compressione molto elevati se utilizzato con file di grandi dimensioni. Utilizza gli algoritmi di compressione combinati di zpaq e lzma per la massima compressione, lzo per la massima velocità e la riduzione della ridondanza a lungo raggio di rzip. È progettato per scalare con incrementi con le dimensioni della RAM, migliorando ulteriormente la compressione. Una scelta di ottimizzazione delle dimensioni o della velocità consente una compressione migliore di quella che può fornire anche lzma o una velocità migliore di gzip, ma con livelli di compressione di dimensioni bzip2.
sudo apt-get install lrzip
Un piccolo benchmark di compressione (utilizzando il test Oli creato):
FORMATO FILE ORIGINALE - 100 MB
PBZIP2 - 101 MB (1% più grande)
PXZ - 101 MB (1% più grande)
PLZIP - 102 MB (1% più grande)
LRZIP - 101 MB (1% più grande)
PIGZ - 101 MB (1% più grande )
Un piccolo benchmark di compressione (usando un file di testo):
FORMATO FILE ORIGINALE - 70 KB File di testo
PBZIP2 - 16,1 KB (23%)
PXZ - 15,4 KB (22%)
PLZIP - 15,5 KB (22,1%)
LRZIP - 15,3 KB (21,8%)
PIGZ - 17,4 KB (24,8%)
lrzip
può essere decompresso usando pbzip2
, per esempio.
Oltre al bel riassunto sopra (grazie Luis), in questi giorni la gente potrebbe anche voler prendere in considerazione PIXZ, che secondo il suo README (Fonte: https://github.com/vasi/pixz - Non ho verificato personalmente le affermazioni ) presenta alcuni vantaggi rispetto a PXZ.
[Compared to PIXZ, PXZ has these advantages and disadvantages:]
* Simpler code
* Uses OpenMP instead of pthreads
* Uses streams instead of blocks, not indexable
* Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage
In altre parole, PIXZ è presumibilmente più efficiente in termini di memoria e disco e ha una funzione di indicizzazione opzionale che accelera la decompressione dei singoli componenti dei file tar compressi.
pixz
archivi non sono compatibili con il xz
formato standard , come pxz
sarebbe.
pixz
può decomprimere xz
archivi e xz
decomprimere pixz
archivi. Tuttavia, le opzioni della riga di comando sono attive xz
e pixz
diverse.
pixz
.
XZ Utils supporta la compressione multi-thread dalla v5.2.0, originariamente erroneamente documentata come decompressione multi-thread.
Per esempio: tar -cf - source | xz --threads=0 > destination.tar.xz
export XZ_DEFAULTS="-T 0"
e quindi usare la solita tar call, ad es tar cJf target.tar.xz source
.
lzop può anche essere un'opzione praticabile, sebbene sia a thread singolo.
Utilizza l' algoritmo di compressione lempel-ziv-oberhumer molto veloce che è 5-6 volte più veloce di gzip nella mia osservazione.
Nota: sebbene non sia ancora multi-thread, probabilmente supererà i pigz sui sistemi 1-4 core. Ecco perché ho deciso di postare questo anche se non risponde direttamente alla tua domanda. Provalo, potrebbe risolvere il problema del collo di bottiglia della CPU usando una sola CPU e comprimendo un po 'peggio. Ho trovato spesso una soluzione migliore rispetto ad esempio a Pigz.
Il compressore LZMA2 di p7zip utilizza entrambi i core sul mio sistema.
Non è proprio una risposta, ma penso che sia abbastanza rilevante condividere i miei parametri di riferimento confrontando la velocità di gzip
e pigz
su un vero HW in uno scenario di vita reale. Come pigz
è l'evoluzione multithread che ho personalmente scelto di utilizzare da ora in poi.
Metadati:
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
(4c / 8t) + SSD NvmeXubuntu 17.10 (artful)
gzip
versione: 1.6
pigz
versione: 2.4
gzip
Presto
time gzip -1kN ./db_dump.sql
real 1m22,271s
user 1m17,738s
sys 0m3,330s
gzip
migliore
time gzip -9kN ./db_dump.sql
real 10m6,709s
user 10m2,710s
sys 0m3,828s
pigz
Presto
time pigz -1kMN ./db_dump.sql
real 0m26,610s
user 1m55,389s
sys 0m6,175s
pigz
migliore (no zopfli
)
time pigz -9kMN ./db_dump.sql
real 1m54,383s
user 14m30,435s
sys 0m5,562s
pigz
+ zopfli
algoritmo
time pigz -11kMN ./db_dump.sql
real 171m33,501s
user 1321m36,144s
sys 0m29,780s
Come linea di fondo non consiglierei l' zopfli
algoritmo poiché la compressione ha richiesto una quantità enorme di tempo per una quantità di spazio su disco non così significativa.
Dimensioni file risultanti:
Zstandard supporta il multi-threading dalla v1.2.0 ¹. È un compressore e un decompressore molto veloce destinato a sostituire gzip e può anche comprimere in modo efficiente - se non migliore - come LZMA2 / XZ ai massimi livelli.
Devi usare artificiosa di rilascio o di un nuovo, o compilare l'ultima versione dal sorgente per ottenere questi benefici. Fortunatamente non ci sono molte dipendenze.