有任意大字典的压缩工具吗?

Anu*_*ush 7 compression gzip bzip2 xz zstd

我正在寻找具有任意大字典(和“块大小”)的压缩工具。让我通过例子来解释。

首先让我们创建 32MB 的随机数据,然后将其连接到自身以制作长度为 64MB 的两倍长度的文件。

head -c32M /dev/urandom > test32.bin
cat test32.bin test32.bin > test64.bin
Run Code Online (Sandbox Code Playgroud)

当然test32.bin不可压缩,因为它是随机的,但前半部分和后半部分test64.bin是一样的,所以应该可以压缩大约 50%。

首先让我们尝试一些标准工具。test64.bin 的大小正好是 67108864。

  • gzip -9。压缩大小 67119133。
  • bzip2 -9。压缩大小 67409123。(开销很大!)
  • xz -7。压缩大小 67112252。
  • xz -8。压缩大小 33561724。
  • zstd --ultra -22。压缩大小 33558039。

我们从中了解到 gzip 和 bzip2 永远不能压缩这个文件。然而,使用足够大的字典 xz 和 zstd 可以压缩文件,在这种情况下, zstd 做得最好。

但是,现在尝试:

head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin
Run Code Online (Sandbox Code Playgroud)

test300.bin 的大小正好是 314572800。让我们在最高设置下再次尝试最佳压缩算法。

  • xz -9。压缩尺寸 314588440
  • zstd --ultra -22。压缩尺寸 314580017

在这种情况下,两个工具都不能压缩文件。

有没有一个工具可以有任意大的字典大小,所以它可以压缩像 test300.bin 这样的文件?


感谢评论和回答,结果证明 zstd 和 xz 都可以做到。但是,您需要 zstd 版本 1.4.x。

  • zstd --long=28。压缩尺寸 157306814
  • xz -9 --lzma2=dict=150MiB。压缩大小 157317764。

A.B*_*A.B 5

它至少可用于xz命令。手册xz页有:

下表总结了预设的功能:

Preset    DictSize    CompCPU     CompMem     DecMem
    -0    256 KiB        0          3 MiB      1 MiB

[...]

    -9     64 MiB        6        674 MiB     65 MiB
Run Code Online (Sandbox Code Playgroud)

列说明:

DictSize 是 LZMA2 字典大小。使用大于未压缩文件大小的字典是浪费内存。这就是为什么在没有真正需要它们时最好避免使用预设 -7 ... -9。[...]

自定义压缩器过滤器链部分所述,您可以简单地手动提供字典大小xz,例如--lzma2=dict=150MiB(我们有洞察信息告诉 150MiB 就足够了,否则必须使用文件大小)。

xz -9 --lzma2=dict=150MiB test300.bin
Run Code Online (Sandbox Code Playgroud)

在执行此操作时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
Run Code Online (Sandbox Code Playgroud)