Compression
有沒有任意大字典的壓縮工具?
我正在尋找具有任意大字典(和“塊大小”)的壓縮工具。讓我通過例子來解釋。
首先讓我們創建 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