ランダムに大きな辞書を作成できる圧縮ツールはありますか?

ランダムに大きな辞書を作成できる圧縮ツールはありますか?

私はランダムに大きな辞書(および「ブロックサイズ」)を持つ圧縮ツールを探しています。たとえば、説明します。

まず、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=150MiB150MiBで十分であることを知っています。それ以外の場合は、ファイルサイズを使用する必要があります。

xz -9 --lzma2=dict=150MiB test300.bin

この作業の間、xzamd64のプロセスはほとんどの場合、最大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

関連情報