私はランダムに大きな辞書(および「ブロックサイズ」)を持つ圧縮ツールを探しています。たとえば、説明します。
まず、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 - スーパー-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 - スーパー-22.圧縮サイズ 314580017
この場合、両方のツールはファイルを圧縮できません。
test300.binなどのファイルを圧縮できるように、ランダムに大きな辞書サイズのツールがありますか?
コメントと回答ありがとうございます。 zstdとxzの両方が可能であることがわかりました。しかし、zstdバージョン1.4.xが必要です。
- zstd --long=28。圧縮サイズ 157306814
- xz -9 --lzma2=dict=150MiB。圧縮サイズは157317764です。
答え1
少なくとも次のように動作できます。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
この作業の間、xz
amd64のプロセスはほとんどの場合、最大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