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


18

(最初に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

オプションは単純にであり-mmt、信じていない-mmt=2。また、適切な構文は-mx9であると思いますが、両方とも機能する可能性があります。
ブレークスルー

感謝しますが、オプションなしの-mmtはまだ1つのスレッドのみを使用します。docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThreadによると、使用するスレッドの数を-mmt = Nで指定できます。
ブライアンL

LZMA / Deflateはシングルスレッドのみですが、使用することをお勧めします。あなたがいる間かもしれない bzip2で増加した圧縮速度を取得し、それはだ少ない効率的なプレーンテキストを圧縮する場合、およびシングルスレッドの変異体は、より遅いLZMA /デフレート同等以上です。
ブレークスルー

@Breakthrough:リンクに示されているように、BZip2は通常、DEFLATEよりも優れた圧縮を実現します。また、LZMA(圧縮時)よりもはるかに高速です。
デニス

回答:


25

よると、-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アルゴリズムを使用しようとしたために発生します。それは可能ではありません。

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

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


@Dennis OPはLZMA(2)を使用していると思っていました。ドキュメントからは、「LZMA圧縮は2つのスレッドのみを使用します。」(Lempel-Zivエンコーディングの仕組みによる)直感的には同意しますが、マルチスレッドLZMAまたはDeflate(ハフマンエンコーディングのLZMAのみ)は非常に困難です。
ブレークスルー

1
@Breakthrough:最初は私もそうでした。(答えの改訂版をチェックしてください。)それが構文エラーの原因です。.zipコンテナではLZMA圧縮を使用できません。
デニス

@デニスああ、それをクリアしていただきありがとうございます。OPが.ZIPコンテナを使用していることがわかりませんでした。
ブレークスルー

待ってください。コンテナのファイル拡張子を.7zに変更するだけで、別の結果が得られますか?
ブライアンL

3
@BrianLには、「ありがとう」ボタンが組み込まれています。上向きの矢印のように見えます;)
nhinkle

5

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

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

pigz -K -k archive.zip bigfile txt

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

単一および複数のコアを使用したzip互換コンプレッサーと非zipコンプレッサーの簡単な比較。

Fedora 20で1.0gbの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

pbzip2またはpixzを使用できるのはなぜpigzですか?
うなずく14

gzipはbzip2よりもはるかに高速であるため、余分な圧縮が常に価値があるとは限りません。
-jesjimher

0

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

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


-1

検証およびテスト済み:7zaでマルチスレッドを使用するには、パラメーターを「-mmt =#」ではなく「-mmt#」にする必要があります。等号を付けると無視されます。

どうやって発見したの?パラメータなしで7zを実行すると、パラメータに関する情報が表示され、スイッチでは「-mmt = [N]」ではなく「-mmt [N]」と表示されます。

したがって、よく理解している場合、「-mmt = 2」と入力しているパラメーターは誤って書き込まれ、等号なしで「-mmt2」になる可能性があります。

私がよく理解しているかどうかはわかりませんが、私の英語は本当に下手です。

ところで、なぜ「7z」ではなく「7za」を使用するのですか?

そのため、パラメータをテストするには、一連のコマンドを実行してベンチマークを行い、いくつかのドキュメントでタイプミスを確認しました。正しいパラメーターは等号なしで入力する必要があります。

スレッドが1つのみの7zでベンチマークを実行するコマンド:7z b -mmt1

2つのスレッドのみで7zを使用してベンチマークを実行するコマンド:7z b -mmt2

2つのスレッドのみで7zaを使用してベンチマークを実行するコマンド:7za b -mmt2

1つのスレッドのみで7zaを使用してベンチマークを実行するコマンド:7za b -mmt1

パラメーターˋ-mmt# ˋには、7zでも7zaでも等号はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.