Multi-Core-Komprimierungswerkzeuge

61

Welche Komprimierungswerkzeuge gibt es in Ubuntu, die von einer Multi-Core-CPU profitieren können ?

Luis Alvarado
quelle
Nur zur Veranschaulichung, eine Alternative könnte darin bestehen, unabhängige Archive parallel zu erstellen. Anstatt also myfiles.8core.xz zu erstellen, erstellen Sie parallel myfiles1.xz zu myfiles8.xz. Dies erfordert einen Versandagenten. Beide Ansätze haben komplementäre Vor- und Nachteile.
Acumenus
2
Es wurde versucht, eine 7-GB-Datei mit bzip2 zu entpacken, um herauszufinden, dass nicht alle meine 8 Kerne verwendet werden. Lesen Sie darüber und beschlossen, pbzip2 zu versuchen. Läuft immer noch auf nur einem Kern. Dann bemerkte ich Kommentare, die besagten, dass pbzip2 die Dekomprimierung von Dateien, die es selbst komprimierte, nur vollständig parallelisieren kann. Dieselben Kommentare deuteten darauf hin, dass lbzip2 alle bz2-Dateien vollständig parallelisieren kann. Dabei wurden fast alle Kerne (80-90% der CPU) von lbzip2 ausgenutzt, und es wurde viel schneller dekomprimiert.
Edi Bice

Antworten:

34

Es gibt zwei Hauptwerkzeuge. lbzip2und pbzip2. Sie sind im Wesentlichen verschiedene Implementierungen von bzip2-Kompressoren. Ich habe sie verglichen (die Ausgabe ist eine aufgeräumte Version, aber Sie sollten in der Lage sein, die Befehle auszuführen)

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

lbzip2scheint der Gewinner bei zufälligen Daten zu sein. Es ist etwas weniger komprimiert, aber viel schneller. YMMV.

Oli
quelle
5
sieht aus wie eine Ziffer fehlt in der Größe pbzip2
Wayne Walker
4
/dev/urandomist keine gute Wahl für das Benchmarking von Komprimierungswerkzeugen, da zufällige Daten per Definition inkomprimierbar sind. Das erklärt zum Teil, warum die Ausgabedatei in beiden Fällen ~ 450 MB größer ist als die Eingabe.
ali_m
1
Tut mir leid, ich bin sehr umständlich, aber wirklich zufällige Daten können überkomprimierbar sein. Man könnte ein perfektes RNG für 32 Bit verlangen und bekommen 00000000000000000000000000000000. So funktioniert Zufall;) Du sprichst von praktischen Durchschnittswerten. Es ist unwahrscheinlich, dass Sie eine 100-MB-Datei mit nur Nullen erstellen. Und ich stimme mit dem Geist dessen überein, was Sie sagen, ich stimme einfach nicht mit der "per Definition" überein, weil das nicht die Definition ist (weil es ungenau ist).
Oli
2
Wenn wir die Leistung verschiedener Komprimierungsmethoden beurteilen, interessiert uns vor allem die erwartete Ausgabegröße für zukünftige Beispiele für die Art von Daten, die wir komprimieren möchten. Wenn diese Daten wirklich zufällig sind, enthält sie keine statistische Regelmäßigkeit, die zur Komprimierung ausgenutzt werden kann. Für Sequenzen von N zufälligen Bytes ist das Beste, was wir jemals hoffen können, eine erwartete Ausgabelänge von N Bytes. Bei einigen Beispielen könnten wir etwas besser abschneiden, bei anderen könnten wir etwas schlechter abschneiden (in der Praxis machen wir fast immer schlechter), aber die erwartete Ausgabelänge bleibt gleich.
ali_m
5
Ich meine "zufällig" im Sinne von Kolmogorov , was wörtlich als Inkomprimierbarkeit definiert wird. Es gibt keinen universellen Maßstab für die Komprimierung, da unterschiedliche Algorithmen für unterschiedliche Datentypen besser funktionieren. Ein guter Anfang könnte darin bestehen, einen Text wget http://mattmahoney.net/dc/enwik8.zipzu übermitteln , z. B. 96 MB (21 MB komprimiert) Text aus Wikipedia. Eine viel umfassendere Reihe von Benchmarks finden Sie hier .
Ali_m
72

Nun, das Schlüsselwort war parallel . Nachdem ich nach allen Komprimierungswerkzeugen gesucht hatte, die auch parallel waren, fand ich Folgendes:

PXZ - Parallel XZ ist ein Komprimierungsprogramm, das die LZMA-Komprimierung verschiedener Teile einer Eingabedatei auf mehreren Kernen und Prozessoren gleichzeitig ausführt . Das Hauptziel ist es, alle Ressourcen zu nutzen, um die Komprimierungszeit bei minimalem Einfluss auf das Komprimierungsverhältnis zu beschleunigen.

sudo apt-get install pxz

PLZIP - Lzip ist ein verlustfreier Datenkomprimierer, der auf dem LZMA-Algorithmus basiert, mit sehr sicherer Integritätsprüfung und einer Benutzeroberfläche ähnlich der von gzip oder bzip2. Lzip dekomprimiert fast so schnell wie gzip und komprimiert besser als bzip2, wodurch es sich gut für die Softwareverteilung und Datenarchivierung eignet.

Plzip ist eine massiv parallele (Multithread-) Version von lzip, die das lzip-Dateiformat verwendet. Die von plzip erstellten Dateien sind vollständig mit lzip kompatibel.

Plzip ist für die schnellere Komprimierung / Dekomprimierung großer Dateien auf Multiprozessor-Rechnern vorgesehen und eignet sich daher besonders für die Verteilung großer Softwaredateien und die Archivierung großer Datenmengen. Für Dateien, die groß genug sind, kann plzip Hunderte von Prozessoren verwenden.

sudo apt-get install plzip

PIGZ - pigz, das für die parallele Implementierung von GZip steht, ist ein voll funktionsfähiger Ersatz für gzip, der beim Komprimieren von Daten mehrere Prozessoren und mehrere Kerne nutzt.

sudo apt-get install pigz

PBZIP2 - pbzip2 ist eine parallele Implementierung des Block-Sorting-Dateikomprimierers bzip2, der Pthreads verwendet und auf SMP-Maschinen eine nahezu lineare Geschwindigkeitssteigerung erzielt. Die Ausgabe dieser Version ist vollständig kompatibel mit bzip2 v1.0.2 (dh alles, was mit pbzip2 komprimiert wurde, kann mit bzip2 dekomprimiert werden).

sudo apt-get install pbzip2

LRZIP - Ein Multithread-Komprimierungsprogramm, das bei großen Dateien sehr hohe Komprimierungsraten und -geschwindigkeiten erzielt . Es verwendet die kombinierten Komprimierungsalgorithmen von zpaq und lzma für die maximale Komprimierung, lzo für die maximale Geschwindigkeit und die Reduzierung der Langstreckenredundanz von rzip. Es ist so konzipiert, dass es mit zunehmender RAM-Größe skaliert und die Komprimierung weiter verbessert. Eine Auswahl an Größen- oder Geschwindigkeitsoptimierungen ermöglicht entweder eine bessere Komprimierung als selbst lzma oder eine bessere Geschwindigkeit als gzip, jedoch mit Komprimierungsstufen der Größe bzip2.

sudo apt-get install lrzip

Ein kleiner Komprimierungsbenchmark (mit dem Test Oli erstellt):


URSPRÜNGLICHE DATEIGRÖSSE - 100 MB PBZIP2 - 101 MB (1% größer)
PXZ - 101 MB (1% größer)
PLZIP - 102 MB (1% größer)
LRZIP - 101 MB (1% größer)
PIGZ - 101 MB (1% größer )

Ein kleiner Komprimierungsbenchmark (Verwenden einer Textdatei):


URSPRÜNGLICHE DATEIGRÖSSE - 70 KB Textdatei 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%)

Luis Alvarado
quelle
Beispiele wären toll.
EarthMeLon
@earthmeLon Lies die Antwort von Oli, in der erwähnt wird, wie die Beispieldatei erstellt wird. Fahren Sie dann mit den Befehlen fort, die ich verwendet habe.
Luis Alvarado
Ich hoffe, die Ausgabe von diesen ist kompatibel. dh die Ausgabe von lrzipkann beispielsweise mit dekomprimiert werden pbzip2.
Vineet Menon
10

Zusätzlich zu der netten Zusammenfassung oben (danke Luis) möchten die Leute heutzutage vielleicht auch PIXZ in Betracht ziehen, was laut README (Quelle: https://github.com/vasi/pixz) der Fall ist. Ich habe die Behauptungen selbst nicht überprüft ) hat einige Vorteile gegenüber 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

Mit anderen Worten, PIXZ ist angeblich speicher- und festplatteneffizienter und verfügt über eine optionale Indizierungsfunktion, die die Dekomprimierung einzelner Komponenten komprimierter TAR-Dateien beschleunigt.

nturner
quelle
Es ist aber mein Verständnis , dass pixzArchive mit Standard nicht kompatibel sind xzFormat, die Art und Weise pxzwäre.
Mxx
5
@Mxx: Die Dateiformate sind kompatibel. pixzKann xzArchive dekomprimieren und Archive xzdekomprimieren pixz. Die Befehlszeilenoptionen sind jedoch ein- xzund pixzunterschiedlich.
Schneeball
Indizierbare Dateien sind ein großer Gewinn für pixz.
Ostrokach
8

Aktualisieren:

XZ Utils unterstützt die Multithread-Komprimierung seit Version 5.2.0. Ursprünglich wurde dies fälschlicherweise als Multithread-Dekomprimierung dokumentiert.

Zum Beispiel: tar -cf - source | xz --threads=0 > destination.tar.xz

Donbradken
quelle
Sie können auch laufen export XZ_DEFAULTS="-T 0" und dann einfach Ihren üblichen tar-Anruf verwenden, dh tar cJf target.tar.xz source.
Scai
4

lzop kann auch eine praktikable Option sein, obwohl es Single-Threaded ist.

Es wird der sehr schnelle lempel-ziv-oberhumer- Komprimierungsalgorithmus verwendet, der meiner Beobachtung nach 5-6 mal schneller ist als gzip.

Hinweis: Obwohl es noch kein Multithreading-System ist, übertrifft es Pigz auf 1-4-Core-Systemen wahrscheinlich. Deshalb habe ich mich entschlossen, dies zu posten, auch wenn es Ihre Frage nicht direkt beantwortet. Probieren Sie es aus, es kann Ihr CPU-Engpass-Problem lösen, wenn Sie nur eine CPU verwenden und etwas schlechter komprimieren. Ich fand es oft eine bessere Lösung als zB pigz.

ce4
quelle
Ist es nicht einfach besser zu dekomprimieren? Das Komprimieren dauert ungefähr genauso (oder schlechter) als gzip
Lennart Rolland
Ich kann auch bezeugen, dass lzop super schnell ist. Proxmox verwendet standardmäßig lzop für die Sicherung virtueller Maschinen.
Lonnie Best
1
lz4 ist noch schneller (und hat eine Multithread-Version).
David Balažic
3

Der LZMA2-Kompressor von p7zip Installieren Sie p7zip verwendet beide Kerne auf meinem System.

David Foerster
quelle
3

Es ist keine wirkliche Antwort, aber ich denke, es ist relevant genug, um meine Benchmarks zu teilen und die Geschwindigkeit von gzipund pigzauf einer realen Hardware in einem realen Szenario zu vergleichen. pigzGenau wie die Multithread-Evolution, die ich von nun an persönlich gewählt habe.

Metadaten:

  • Verwendete Hardware: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + Nvme SSD
  • GNU / Linux-Distribution: Xubuntu 17.10 (artful)
  • gzip Ausführung: 1.6
  • pigz Ausführung: 2.4
  • Die zu komprimierende Datei ist 9.25 GiB SQL Dump

gzip schnell

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip Beste

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz schnell

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigzam besten (nein zopfli)

time pigz -9kMN ./db_dump.sql 

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

pigz+ zopfliAlgorithmus

time pigz -11kMN ./db_dump.sql 

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

Unter dem Strich würde ich den zopfliAlgorithmus nicht empfehlen , da die Komprimierung enorm viel Zeit in Anspruch nahm, um nicht so viel Speicherplatz zu sparen.

Resultierende Dateigrößen:

  • bestes s: 1309M
  • schnell s: 1680M
  • Zopfli : 1180M
helvete
quelle
2

Zstandard unterstützt Multi-Threading seit v1.2.0 ¹. Es ist ein sehr schneller Kompressor und Dekompressor, der gzip ersetzen soll, und es kann auch so effizient - wenn nicht sogar besser - komprimieren wie LZMA2 / XZ auf höchstem Niveau.

Sie müssen artful oder eine neuere Version verwenden oder die neueste Version aus dem Quellcode kompilieren, um diese Vorteile nutzen zu können. Zum Glück bringt es nicht viele Abhängigkeiten mit sich.

  1. In Version 1.1.0 von ZSTD gab es auch einen PZSTD von Drittanbietern.
LiveWireBT
quelle