Compression

有沒有任意大字典的壓縮工具?

  • January 19, 2020

我正在尋找具有任意大字典(和“塊大小”)的壓縮工具。讓我通過例子來解釋。

首先讓我們創建 32MB 的隨機數據,然後將其連接到自身以生成長度為 64MB 的兩倍長度的文件。

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

當然test32.bin是不可壓縮的,因為它是隨機的,但前半部分與後半部分test64.bin相同,所以它應該可以壓縮大約 50%。

首先讓我們嘗試一些標準工具。test64.bin 的大小正好是 67108864。

  • 壓縮包-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。

它至少可用於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

引用自:https://unix.stackexchange.com/questions/562818