Multithread-Unterstützung in 7za

Multithread-Unterstützung in 7za

(Ich habe dies zuerst auf Serverfault gepostet, aber dann wurde mir klar, 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 Wirkung zu haben. Ich habe sowohl -mmt=on als auch -mmt=2 ausprobiert. Dies ist eine 8-Core-Maschine. Jemand hat vorgeschlagen, -m0=lzma2 als Argument hinzuzufügen, aber das gibt mir nur E_INVALIDARG. Weiß jemand, wie das funktioniert?

Dies hat keine Auswirkungen:

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

Und dies schlägt mit einem Fehler fehl:

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

Antwort1

Entsprechend-m (Komprimierungsmethode festlegen) Schalter # ZipMultiThread - 7ZIP Handbuch & Dokumentation, mtder Standardwert ist on, daher muss es überhaupt nicht angegeben werden.

Die Implementierung des DEFLATE-Algorithmus in 7zip 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 KomprimierenmehrereDateien komprimiert die Multithreading-Option eine Datei pro Kern auf einmal.

Probieren Sie es aus und Sie werden sehen, dass

7za a archive.zip bigfile1 ... bigfileN

verwendet alle verfügbaren NKerne.

Wenn Sie die Komprimierung einereinzelDatei haben Sie zwei Möglichkeiten:

  1. bigfileIn Stücke aufteilen .

  2. Verwenden Sie einen anderen Komprimierungsalgorithmus.

    Beispielsweise unterstützt die Implementierung des BZip2-Algorithmus in 7zip Multithreading.

    Die Syntax lautet:

    7za a -mm=BZip2 archive.zip bigfile
    

Außerdem wird der Syntaxfehler durch Ihren Versuch verursacht, den LZM-Algorithmus für einen .zipContainer zu verwenden. Das ist nicht möglich.

Die möglichen Algorithmen für .zipContainer 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.

Antwort2

Dies ist eine alte Frage und nicht die Antwort auf die konkrete Frage, sondern eine Antwort auf den Sinn 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 bei gleichem Komprimierungsgrad 7-mal schneller eine ZIP-kompatible Datei.

Ein kurzer Vergleich von ZIP-kompatiblen und nicht-ZIP-Kompressoren mit einem und mehreren Kernen.

Wandzeiten auf i7-2600k, um 1,0 GB 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)

Wandzeiten zum Entspannen

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

Antwort3

Eine weitere Möglichkeit, Multithread-Komprimierung unter Linux zu erreichen, ist die Verwendung der von Facebook verwendeten Methode.Z-StandardUnter Ubuntu installieren Sie es wie folgt:

sudo apt install zstd

Superschnelle Multithread-Komprimierung:

tar cf - /folder/you/want/to/compress | zstdmt -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Sie können die Komprimierungsstufen 1-19 angeben (3 ist die Standardeinstellung).

Maximale Komprimierung (langsamste):

tar cf - /folder/you/want/to/compress | zstdmt -19 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Mittlere Komprimierung (Stufe 10):

tar cf - /folder/you/want/to/compress | zstdmt -10 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

Meiner allgemeinen Erfahrung nach ist die Zstandard-Komprimierung nicht so stark wie die von 7zip, aber sie ist viel schneller und der zstdmtBefehl versucht, alle Kerne zu nutzen.

Übrigens, unter Windows verwendet 7zip standardmäßig alle Prozessoren und ich bin sehr enttäuscht, dass dies unter Linux nicht der Fall ist. Zu diesem Zeitpunkt ist es schon seit mehreren Jahren so und ich wünschte, 7zip wäre auch unter Linux standardmäßig mehrfädig.

Antwort4

Verwenden Sie einfach -mmt[N+1]

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

verwandte Informationen