
(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, mt
der 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 .zip
Dateien 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 N
Kerne.
Wenn Sie die Komprimierung einereinzelDatei haben Sie zwei Möglichkeiten:
bigfile
In Stücke aufteilen .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 .zip
Container zu verwenden. Das ist nicht möglich.
Die möglichen Algorithmen für .zip
Container sind DEFLATE(64), BZip2 und keine Komprimierung.
Wenn Sie den LZM-Algorithmus verwenden möchten, verwenden Sie einen .7z
Container. 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 zstdmt
Befehl 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