有没有可以任意大字典的压缩工具?

有没有可以任意大字典的压缩工具?

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

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

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

相关内容