
(私はこれを最初に serverfault に投稿しましたが、その後、ここに投稿するべきだと気付きました。)
7za (p7zip) 9.20 を使用して非常に大きなテキスト ファイルを圧縮しようとしています。-mmt オプションは効果がないようです。-mmt=on と -mmt=2 の両方を試しました。これは 8 コア マシンです。ある人が引数として -m0=lzma2 を追加することを提案しましたが、それだと E_INVALIDARG が返されるだけです。これを機能させる方法を誰か知っていますか?
これは効果がありません:
7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt
そして、これはエラーで失敗します:
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
答え1
によると-m (圧縮方法の設定) スイッチ # ZipMultiThread - 7ZIP マニュアル & ドキュメントはmt
デフォルトで になるon
ため、指定する必要はありません。
ただし、7zip の DEFLATE アルゴリズムの実装はマルチスレッドをサポートしていません。
すでにご存知のとおり、
7za a archive.zip bigfile
1 つのコアのみを使用します。
しかし、.zip
ファイルは各ファイルを個別に圧縮します。圧縮するといくつかのファイルの場合、マルチスレッド オプションでは、コアごとに 1 つのファイルを一度に圧縮します。
試してみればわかる
7za a archive.zip bigfile1 ... bigfileN
利用可能なすべてのコアを使用しますN
。
圧縮を高速化したい場合は、シングルファイルには 2 つの選択肢があります。
bigfile
チャンクに分割します。別の圧縮アルゴリズムを使用します。
たとえば、7zip の BZip2 アルゴリズムの実装はマルチスレッドをサポートしています。
構文は次のとおりです。
7za a -mm=BZip2 archive.zip bigfile
また、構文エラーは、.zip
コンテナに LZM アルゴリズムを使用しようとしたために発生します。これは不可能です。
コンテナに使用できるアルゴリズムは、.zip
DEFLATE(64)、BZip2、および圧縮なしです。
LZM アルゴリズムを使用する場合は、.7z
コンテナを使用します。このコンテナは、PPMd、BZip2、DEFLATE、BCJ、BCJ2、および圧縮なしのアルゴリズムも処理します。
答え2
これは古い質問であり、特定の質問に対する回答ではありませんが、質問の精神に対する回答です(すべてのコアを使用して zip 形式を圧縮する)
pigz (.zip オプション付きの並列 gzip)
pigz -K -k archive.zip bigfile txt
これにより、同じ圧縮レベルで zip 互換ファイルが 7 倍高速化されます。
単一コアと複数コアを使用した、zip 互換および非 zip 圧縮プログラムの簡単な比較。
i7-2600k で 1.0 GB の txt ファイルを fedora 20 で圧縮するのにかかる時間
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)
減圧までのウォールタイム
4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
答え3
Linuxでマルチヘッド圧縮を実現するもう1つの方法は、Facebookが使用しているものを使用することです。Z標準Ubuntu では、次のようにインストールします。
sudo apt install zstd
超高速マルチスレッド圧縮:
tar cf - /folder/you/want/to/compress | zstdmt -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst
圧縮レベルは 1 ~ 19 まで指定できます (デフォルトは 3)。
最大圧縮(最も遅い):
tar cf - /folder/you/want/to/compress | zstdmt -19 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst
中程度の圧縮(レベル10):
tar cf - /folder/you/want/to/compress | zstdmt -10 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst
私の全体的な経験では、Zstandard 圧縮は 7zip ほど強力ではありませんが、はるかに高速で、zstdmt
コマンドはすべてのコアを使用しようとします。
ちなみに、Windows では、7zip はデフォルトですべてのプロセッサを使用しますが、Linux ではそうではないのは非常に残念です。これは数年前から続いていることであり、Linux でも 7zip がデフォルトでマルチスレッド化されることを望みます。
答え4
-mmt[N+1]を使用するだけです
たとえば、-mmt2 は 1 つのスレッド、-mmt9 は 8 つのスレッドです。