Strumenti di compressione multi-core


61

Quali strumenti di compressione sono disponibili in Ubuntu che possono beneficiare di una CPU multi-core.


Solo per la cronaca, un'alternativa potrebbe essere quella di creare archivi indipendenti in parallelo. Quindi, invece di creare myfiles.8core.xz, crei myfiles1.xz in myfiles8.xz in parallelo. Ciò richiederà un agente di spedizione. Entrambi gli approcci hanno pro e contro complementari.
Acumenus,

2
Ho provato a decomprimere un file da 7 GB usando bzip2 solo per scoprire che non sta usando tutti i miei 8 core. Leggilo e ho deciso di provare pbzip2. Funziona ancora su un solo core. Poi ho notato commenti che dicevano che pbzip2 poteva solo parallelizzare completamente la decompressione dei file compressi. Stessi commenti suggeriscono che lbzip2 può essere completamente parallelizzato su qualsiasi file bz2, il che è vero - ha fatto un uso quasi completo (80-90% della CPU) di tutti i miei core e si è decompresso molto più velocemente.
Edi Bice,

Risposte:


34

Esistono due strumenti principali. lbzip2e 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

lbzip2sembra essere il vincitore di dati casuali. È leggermente meno compresso ma molto più veloce. YMMV.


5
sembra che manchi una cifra nella dimensione pbzip2
Wayne Walker,

4
/dev/urandomnon è 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.
ali_m

1
Mi dispiace, sono molto pedante ma i dati veramente casuali possono essere super-comprimibili. Potresti chiedere un RNG perfetto per 32 bit e ottenere 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).
Oli

2
Quando valutiamo le prestazioni di diversi metodi di compressione, ciò a cui siamo veramente interessati è la dimensione di output prevista per futuri esempi del tipo di dati che vogliamo comprimere. Se questi dati sono veramente casuali, allora non contengono regolarità statistica da sfruttare per la compressione, quindi per le sequenze di N byte casuali il meglio che possiamo sperare è una lunghezza di output prevista di N byte. Per alcuni esempi potremmo fare un po 'meglio, per altri potremmo fare un po' peggio (in pratica facciamo quasi sempre peggio), ma la lunghezza di output prevista rimane la stessa.
ali_m,

5
Intendo "casuale" nel senso di Kolmogorov , che è letteralmente definito come incomprimibilità. Non esiste un benchmark universale per la compressione poiché algoritmi diversi funzionano meglio per diversi tipi di dati. Un buon inizio potrebbe essere solo quello di scrivere un po 'di testo, ad esempio wget http://mattmahoney.net/dc/enwik8.zipper catturare 96 MB (21 MB compressi) di testo da Wikipedia. Per una suite di benchmark molto più completa, vedere qui .
ali_m

72

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%)


Gli esempi sarebbero fantastici.
earthmeLon

@earthmeLon Leggi la risposta di Oli che menziona come creare il file di esempio. Quindi procedere con i comandi che ho usato.
Luis Alvarado,

Spero che l'output di questi sia intercompatibile. cioè l'output di lrzippuò essere decompresso usando pbzip2, per esempio.
Vineet Menon,

10

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.


Tuttavia, è mia comprensione che gli pixzarchivi non sono compatibili con il xzformato standard , come pxzsarebbe.
Mxx,

5
@Mxx: i formati di file sono compatibili. pixzpuò decomprimere xzarchivi e xzdecomprimere pixzarchivi. Tuttavia, le opzioni della riga di comando sono attive xze pixzdiverse.
Snowball,

I file indicizzabili sono una grande vittoria per pixz.
ostrokach,

9

Aggiornare:

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


Puoi anche eseguire export XZ_DEFAULTS="-T 0" e quindi usare la solita tar call, ad es tar cJf target.tar.xz source.
scai,

4

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.


Non è solo meglio di decomprimere? La compressione richiede circa lo stesso (o peggio) di gzip
Lennart Rolland,

Posso anche testimoniare che lzop è super veloce. Proxmox utilizza lzop per il backup delle macchine virtuali per impostazione predefinita.
Lonnie Best

1
lz4 è ancora più veloce (e ha una versione multi-thread).
David Balažic,


3

Non è proprio una risposta, ma penso che sia abbastanza rilevante condividere i miei parametri di riferimento confrontando la velocità di gzipe pigzsu 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:

  • Hardware utilizzato: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + SSD Nvme
  • Distribuzione GNU / Linux: Xubuntu 17.10 (artful)
  • gzip versione: 1.6
  • pigz versione: 2.4
  • Il file da comprimere è dump SQL da 9,25 GiB

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

pigzmigliore (no zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopflialgoritmo

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

Come linea di fondo non consiglierei l' zopflialgoritmo poiché la compressione ha richiesto una quantità enorme di tempo per una quantità di spazio su disco non così significativa.

Dimensioni file risultanti:

  • migliore s: 1309M
  • s veloce : 1680 M.
  • zopfli : 1180M

2

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.

  1. C'era anche un pzstd di terze parti in v1.1.0 di zstd.
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.