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 和 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。让我们在最高设置下再次尝试最佳压缩算法。
在这种情况下,两个工具都不能压缩文件。
有没有一个工具可以有任意大的字典大小,所以它可以压缩像 test300.bin 这样的文件?
感谢评论和回答,结果证明 zstd 和 xz 都可以做到。但是,您需要 zstd 版本 1.4.x。
它至少可用于xz
命令。手册xz
页有:
下表总结了预设的功能:
Run Code Online (Sandbox Code Playgroud)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
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)