Welche Komprimierungswerkzeuge gibt es in Ubuntu, die von einer Multi-Core-CPU profitieren können ?
Welche Komprimierungswerkzeuge gibt es in Ubuntu, die von einer Multi-Core-CPU profitieren können ?
Antworten:
Es gibt zwei Hauptwerkzeuge. lbzip2
und 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
lbzip2
scheint der Gewinner bei zufälligen Daten zu sein. Es ist etwas weniger komprimiert, aber viel schneller. YMMV.
/dev/urandom
ist 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.
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).
wget http://mattmahoney.net/dc/enwik8.zip
zu übermitteln , z. B. 96 MB (21 MB komprimiert) Text aus Wikipedia. Eine viel umfassendere Reihe von Benchmarks finden Sie hier .
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%)
lrzip
kann beispielsweise mit dekomprimiert werden pbzip2
.
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.
pixz
Archive mit Standard nicht kompatibel sind xz
Format, die Art und Weise pxz
wäre.
pixz
Kann xz
Archive dekomprimieren und Archive xz
dekomprimieren pixz
. Die Befehlszeilenoptionen sind jedoch ein- xz
und pixz
unterschiedlich.
pixz
.
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
export XZ_DEFAULTS="-T 0"
und dann einfach Ihren üblichen tar-Anruf verwenden, dh tar cJf target.tar.xz source
.
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.
Der LZMA2-Kompressor von p7zip verwendet beide Kerne auf meinem System.
Es ist keine wirkliche Antwort, aber ich denke, es ist relevant genug, um meine Benchmarks zu teilen und die Geschwindigkeit von gzip
und pigz
auf einer realen Hardware in einem realen Szenario zu vergleichen. pigz
Genau wie die Multithread-Evolution, die ich von nun an persönlich gewählt habe.
Metadaten:
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
(4c / 8t) + Nvme SSDXubuntu 17.10 (artful)
gzip
Ausführung: 1.6
pigz
Ausführung: 2.4
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
pigz
am besten (nein zopfli
)
time pigz -9kMN ./db_dump.sql
real 1m54,383s
user 14m30,435s
sys 0m5,562s
pigz
+ zopfli
Algorithmus
time pigz -11kMN ./db_dump.sql
real 171m33,501s
user 1321m36,144s
sys 0m29,780s
Unter dem Strich würde ich den zopfli
Algorithmus nicht empfehlen , da die Komprimierung enorm viel Zeit in Anspruch nahm, um nicht so viel Speicherplatz zu sparen.
Resultierende Dateigrößen:
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.