web-dev-qa-db-ja.com

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
19
Brian L

-m(圧縮方法の設定)スイッチ#ZipMultiThread-7Zipのマニュアルとドキュメント によると、mtはデフォルトでonになるため、指定する必要はありません。

ただし、7ZipのDEFLATEアルゴリズムの実装はマルチスレッドをサポートしていません。

あなたがすでに発見したように、

7za a archive.Zip bigfile

1つのコアのみを使用します。

ただし、.Zipファイルは、すべてのファイルを個別に圧縮します。 いくつかのファイルを圧縮するとき、マルチスレッドオプションはコアごとに一度に1つのファイルを圧縮します。

試してみてください。

7za a archive.Zip bigfile1 ... bigfileN

使用可能なすべてのNコアを使用します。

singleファイルの圧縮を高速化する場合は、2つの選択肢があります。

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

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

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

    構文は次のとおりです。

    7za a -mm=BZip2 archive.Zip bigfile
    

また、構文エラーは、.ZipコンテナにLZMアルゴリズムを使用しようとしたことが原因で発生します。それは可能ではありません。

.Zip conatinersの可能なアルゴリズムは、DEFLATE(64)、BZip2、圧縮なしです。

LZMアルゴリズムを使用する場合は、.7zコンテナを使用します。このコンテナは、PPMd、BZip2、DEFLATE、BCJ、BCJ2および圧縮なしのアルゴリズムも処理します。

25
Dennis

これは古い質問であり、特定の質問に対する回答ではなく、質問の精神に対する回答です(すべてのコアを使用してZip形式を圧縮します)。

pigz(.Zipオプション付きの並列gzip)

pigz -K -k archive.Zip bigfile txt

これにより、同じ圧縮レベルでZip互換ファイルが7倍速くなります。

シングルおよびマルチコアを使用したZip互換および非Zipコンプレッサーの簡単な比較。

fedora 20で1.07 GBのtxtファイルを圧縮するためのi7-2600kのウォールタイム

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
5
tgeorge

-mmt [N + 1]を使用するだけです

例:-mmt2は1つのスレッド、-mmt9は8つのスレッド

0
acubed