web-dev-qa-db-ja.com

7z形式での高速圧縮(Zipやgzipなど)

つまり、Deflate圧縮は、7zipのZip形式(-tzip)でのみ使用できますか?


I/O速度を圧縮なしと同じかそれ以上に保ちながら、大きなディレクトリ(数百GiB)をディスクから別のディスクにアーカイブしたいと思います。

さまざまな理由で7z形式が好きですが、LZMAとBzip2の圧縮は-mx=1でも遅すぎます。 7z a -mm=Zip -mx=1 -mmt=4(およびDeflateも使用する-mm=GZip)を試しましたが、ファイルスキャンフェーズの後に引数エラーが発生します。 http://7Zip.bugaco.com/7Zip/MANUAL/switches/method.htm

私の典型的な解決策は、.tar.lzo(LZOP)を使用したtarです。これは、デフォルトの圧縮率でシングルスレッドで100 MiB/sに簡単に到達します。または.tar.gzGZIP=-1。非常に高速なコンプレッサーはマルチスレッドを備えたlbzip2ですが、tar自体から実行することはできません。

私のソースディスクは通常20MiB/s、時には100(ファイルは数MiB大きい)で読み取ります。ターゲットは最大80MiB/sで書き込みます。したがって、これは、理想的にはシングルスレッドの場合でも、コンプレッサーが持つべき速度です。最大8コアと16GB RAMが利用可能です。

1
Nemo

7-Zip Zstandard バージョンを試すことができます。このフォークは、圧縮と解凍が非常に高速な追加のコーデックをサポートします。

使用されているコーデックの概要は次のとおりです。

  1. LZ4-最速の圧縮/解凍ですが、圧縮率はそれほど高くありません

  2. Lizard/LZ5-LZ4よりも優れた比率であり、多くの場合、LZ4よりも解凍時に高速です...しかし、圧縮は少し遅いです

  3. BrotliとZstandard-zstdはBrotliよりも少し速いことがよくありますが、テキストコンテンツの場合、Brotliの方が少し優れているかもしれません;)

スレッド化は、現在最大256スレッドの5つのコーデックすべてでサポートされています。

次のように実行します。

7z a archiv.7z -m0=lz5 -mx1 -mmt=4

7z a archiv.7z -m0=zstd -mx1 -mmt=4

7z a archiv.7z -m0=brotli -mx1 -mmt=1 .. 7z a archiv.7z -m0=brotli -mx1 -mmt=256

等々...

4
Tino Reichardt

非常に高速なコンプレッサーはマルチスレッドを備えたlbzip2ですが、tar自体から実行することはできません。

Gnu tarでは、フラグ付きのコンプレッサーを指定できます。例:tar -I "zstd -T0"またはtar --use-compress-program=pigz

高速なシングルスレッドコンプレッサーが必要な場合は、lz4を使用できます。

ただし、これを使用する必要はありません。選択したコンプレッサーを介して出力をパイプすることもできます。

# create
tar -c /inputdir | pigz --fast > output.tar.gz
# decompress
pigz -d input.tar.gz | tar -x 

私のソースディスクは通常20MiB/s、時には100で読み取ります

これは、圧縮ではなくランダムアクセス読み取りで実際にボトルネックになっているように聞こえます。大きなファイルがある場合は、それらを最適化する必要があります。小さなファイルがたくさんある場合は、ディスクがrelatimeでマウントされていることを確認する必要があります。また、多くの小さなファイルの場合に最適化した fastar を試すこともできます。

2
the8472