Multithread-Unterstützung in 7za

18

(Ich habe dies zuerst auf serverfault gepostet, aber dann habe ich gemerkt, dass es wahrscheinlich hierher gehört.)

Ich versuche, eine sehr große Textdatei mit 7za (p7zip) 9.20 zu komprimieren. Die Option -mmt scheint keine Auswirkung zu haben. Ich habe sowohl -mmt = on als auch -mmt = 2 ausprobiert. Dies ist eine 8-Kern-Maschine. Eine Person schlug vor, -m0 = lzma2 als Argument hinzuzufügen, aber das gibt mir nur E_INVALIDARG. Weiß jemand, wie man das zum Laufen bringt?

Dies hat keine Auswirkung:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

Und das scheitert mit einem Fehler:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG
Brian L
quelle
Ich glaube, die Option ist einfach -mmtnicht -mmt=2. Auch ich glaube die richtige Syntax ist -mx9, obwohl beide funktionieren könnten.
Durchbruch
Danke, aber -mmt ohne Option verwendet immer noch nur einen Thread. Gemäß docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread können Sie die Anzahl der Threads angeben, die mit -mmt = N verwendet werden sollen.
Brian L
Ich würde immer noch empfehlen, LZMA / Deflate zu verwenden, obwohl es nur ein Thread ist. Während Sie mit BZip2 möglicherweise eine höhere Komprimierungsgeschwindigkeit erzielen, ist es beim Komprimieren von einfachem Text weniger effizient und die Singlethread -Varianten sind langsamer als die LZMA / Deflate-Entsprechungen.
Durchbruch
@Breakthrough: BZip2 erzielt normalerweise eine bessere Komprimierung als DEFLATE, wie in Ihrem Link gezeigt. Es ist auch viel, viel schneller als LZMA (beim Komprimieren).
Dennis

Antworten:

25

Nach -m (Set - Kompressionsverfahren) Schalter # ZipMultiThread - 7ZIP Handbuch & Dokumentation , mtStandardwerte on, so gibt es keine Notwendigkeit , es überhaupt zu spezifizieren.

7zips Implementierung des DEFLATE-Algorithmus unterstützt jedoch kein Multithreading!

Wie Sie bereits festgestellt haben,

7za a archive.zip bigfile

Verwendet nur einen Kern.

Aber .zipDateien komprimieren jede Datei einzeln. Beim Komprimieren mehrerer Dateien komprimiert die Multithreading-Option eine Datei pro Kern gleichzeitig.

Probieren Sie es aus und Sie werden sehen, dass

7za a archive.zip bigfile1 ... bigfileN

verwendet alle verfügbaren NKerne.

Wenn Sie die Komprimierung einer einzelnen Datei beschleunigen möchten , haben Sie zwei Möglichkeiten:

  1. Aufgeteilt bigfilein Stücke schneiden.

  2. Verwenden Sie einen anderen Komprimierungsalgorithmus.

    Beispielsweise unterstützt 7zips Implementierung des BZip2-Algorithmus Multithreading.

    Die Syntax lautet:

    7za a -mm=BZip2 archive.zip bigfile
    

Der Syntaxfehler wird auch durch den Versuch verursacht, den LZM-Algorithmus für einen .zipContainer zu verwenden. Das ist nicht möglich.

Die möglichen Algorithmen für .zipConatiners sind DEFLATE (64), BZip2 und keine Komprimierung.

Wenn Sie den LZM-Algorithmus verwenden möchten, verwenden Sie einen .7zContainer. Dieser Container verarbeitet auch die folgenden Algorithmen: PPMd, BZip2, DEFLATE, BCJ, BCJ2 und keine Komprimierung.

Dennis
quelle
@ Tennis Ich dachte, das OP verwendet LZMA (2), was aus der Dokumentation "LZMA-Komprimierung verwendet nur 2 Threads." Obwohl ich intuitiv zustimme (aufgrund der Funktionsweise der Lempel-Ziv-Codierung ), wäre es sehr schwierig, LZMA oder Deflate (was nur LZMA mit Huffman-Codierung ist) zu multithreaden.
Durchbruch
1
@Breakthrough: Zuerst tat ich es auch. (Überprüfen Sie die Überarbeitungen meiner Antwort.) Darum ging es bei dem Syntaxfehler. Sie können die LZMA-Komprimierung nicht für einen .zipContainer verwenden.
Dennis
@Dennis ah, danke, dass du das geklärt hast. Ich habe nicht gesehen, dass das OP einen .ZIPContainer verwendet.
Durchbruch
Warten Sie, ich erhalte ein anderes Ergebnis, wenn ich nur die Dateierweiterung des Containers in .7z ändere.
Brian L
3
@ BrianL Es gibt einen eingebauten "Danke" -Button. Es sieht aus wie ein Pfeil nach oben;)
Denk dran
5

Dies ist eine alte Frage und nicht die Antwort auf die spezifische Frage, sondern eine Antwort auf den Grundgedanken der Frage (Verwenden aller Kerne zum Komprimieren eines Zip-Formats).

pigz (paralleles gzip mit .zip Option)

pigz -K -k archive.zip bigfile txt

Dadurch erhalten Sie eine zip-kompatible Datei 7x schneller bei gleicher Komprimierungsstufe.

Ein schneller Vergleich von zip-kompatiblen und nicht zip-kompatiblen Kompressoren mit einem oder mehreren Kernen.

wall mal auf i7-2600k um 1.0gb txt datei auf fedora 20 zu komprimieren

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

wand mal zum dekomprimieren

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
Tgeorge
quelle
warum pigz wenn du pbzip2 oder pixz kannst?
nicken
gzip ist viel, viel schneller als bzip2, daher lohnt sich die zusätzliche Komprimierung nicht immer.
Jesjimher
0

Benutze einfach -mmt [N + 1]

Beispiel: -mmt2 steht für einen Thread, -mmt9 für acht Threads

acubed
quelle
-1

Verifiziert und getestet: Um Multithreading auf 7za verwenden zu können, muss der Parameter "-mmt #" und nicht "-mmt = #" sein. Wenn Sie das Gleichheitszeichen setzen, wird es ignoriert.

Wie hatte ich entdeckt? Nachdem ich 7z ohne Parameter ausgeführt habe, werden die Informationen zu den Parametern angezeigt. Auf den Schaltern wird "-mmt [N]" und nicht "-mmt = [N]" angezeigt.

Also, wenn ich es richtig verstehe, kann der Parameter, den Sie "-mmt = 2" eingeben, falsch geschrieben und "-mmt2" sein, ohne das Gleichheitszeichen.

Nicht sicher, ob ich gut verstehe, mein Englisch ist wirklich schlecht.

Übrigens, warum benutzt du "7za" anstatt nur "7z"?

Um den Parameter zu testen, führe ich eine Reihe von Befehlen aus, um Benchmarks zu erstellen, und dies bestätigte den Tippfehler in einigen Dokumentationen. Der richtige Parameter muss ohne Gleichheitszeichen eingegeben werden.

Befehl, einen Benchmark mit 7z mit nur einem Thread durchzuführen: 7z b -mmt1

Befehl, einen Benchmark mit 7z mit nur zwei Threads durchzuführen: 7z b -mmt2

Befehl, mit 7za einen Benchmark mit nur zwei Threads durchzuführen: 7za b -mmt2

Befehl, mit 7za einen Benchmark mit nur einem Thread durchzuführen: 7za b -mmt1

Es gibt kein Gleichheitszeichen für den Parameter ˋ-mmt # ˋ, weder für 7z noch für 7za.

Laura
quelle