web-dev-qa-db-ja.com

任意に大きい辞書を備えた圧縮ツールはありますか?

任意の大きな辞書(および「ブロックサイズ」)を備えた圧縮ツールを探しています。例を挙げて説明します。

まず32MBのランダムデータを作成し、それを連結して、長さ64MBの2倍の長さのファイルを作成します。

head -c32M /dev/urandom > test32.bin
cat test32.bin test32.bin > test64.bin

もちろんtest32.binはランダムなので圧縮できませんが、test64.binの前半は後半と同じなので、約50%圧縮できるはずです。

まず、いくつかの標準ツールを試してみましょう。 test64.binのサイズは正確に67108864です。

  • gzip -9。圧縮サイズ67119133。
  • bzip2 -9。圧縮サイズ67409123。(非常に大きなオーバーヘッド!)
  • xz -7。圧縮サイズ67112252。
  • xz -8。圧縮サイズ33561724。
  • zstd --ultra -22。圧縮サイズ33558039。

これから、gzipとbzip2はこのファイルを圧縮できないことがわかります。ただし、十分に大きい辞書を使用すると、xzとzstdはファイルを圧縮できます。その場合、zstdが最適です。

ただし、今試してください:

head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin

test300.binのサイズは正確に314572800です。最高の設定で最高の圧縮アルゴリズムをもう一度試してみましょう。

  • xz -9。圧縮サイズ314588440
  • zstd --ultra -22。圧縮サイズ314580017

この場合、どちらのツールもファイルを圧縮できません。

Test300.binなどのファイルを圧縮できるように、辞書のサイズが任意に大きいツールはありますか?


コメントと回答のおかげで、zstdとxzの両方で実行できることがわかりました。ただし、zstdバージョン1.4.xが必要です。

  • zstd --long = 28。圧縮サイズ157306814
  • xz -9 --lzma2 = dict = 150MiB。圧縮サイズ157317764。
6
Anush

少なくとも xz コマンドで利用できます。 xzマンページには、

次の表は、プリセットの機能をまとめたものです。

_Preset    DictSize    CompCPU     CompMem     DecMem
    -0    256 KiB        0          3 MiB      1 MiB

[...]

    -9     64 MiB        6        674 MiB     65 MiB
_

列の説明:

DictSizeはLZMA2辞書のサイズです。圧縮されていないファイルのサイズよりも大きい辞書を使用することは、メモリの浪費です。このため、プリセット-7 ... -9を実際に必要としない場合は、使用しないことをお勧めします。 [...]

カスタムコンプレッサーフィルターチェーン セクションに記載されているように、_xzに手動でディクショナリサイズを手動で指定できます。例:_--lzma2=dict=150MiB_(150MiBで十分であるという洞察情報があります)それ以外の場合は、ファイルサイズを使用する必要があります)。

_xz -9 --lzma2=dict=150MiB test300.bin
_

これを行っている間、AMD64のxzプロセスは、常駐メモリの約1.6gの使用率でほとんどの時間とどまりました。

_$ ls -l test*
-rw-r--r--. 1 user user 157286400 Jan 19 16:03 test150.bin
-rw-r--r--. 1 user user 157317764 Jan 19 16:03 test300.bin.xz
_
4
A.B