任意の大きな辞書(および「ブロックサイズ」)を備えた圧縮ツールを探しています。例を挙げて説明します。
まず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とbzip2はこのファイルを圧縮できないことがわかります。ただし、十分に大きい辞書を使用すると、xzとzstdはファイルを圧縮できます。その場合、zstdが最適です。
ただし、今試してください:
head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin
test300.binのサイズは正確に314572800です。最高の設定で最高の圧縮アルゴリズムをもう一度試してみましょう。
この場合、どちらのツールもファイルを圧縮できません。
Test300.binなどのファイルを圧縮できるように、辞書のサイズが任意に大きいツールはありますか?
コメントと回答のおかげで、zstdとxzの両方で実行できることがわかりました。ただし、zstdバージョン1.4.xが必要です。
少なくとも 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
_