7za のマルチスレッドサポート

7za のマルチスレッドサポート

(私はこれを最初に 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 つの選択肢があります。

  1. bigfileチャンクに分割します。

  2. 別の圧縮アルゴリズムを使用します。

    たとえば、7zip の BZip2 アルゴリズムの実装はマルチスレッドをサポートしています。

    構文は次のとおりです。

    7za a -mm=BZip2 archive.zip bigfile
    

また、構文エラーは、.zipコンテナに LZM アルゴリズムを使用しようとしたために発生します。これは不可能です。

コンテナに使用できるアルゴリズムは、.zipDEFLATE(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 つのスレッドです。

関連情報