我正在寻找具有任意大字典(和“块大小”)的压缩工具。让我通过例子来解释。
首先让我们创建 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
手册页有:如自定义压缩器过滤器链部分所述,您可以简单地手动提供字典大小
xz
,例如--lzma2=dict=150MiB
(我们有洞察信息告诉 150MiB 就足够了,否则怀疑必须使用文件大小)。在执行此
xz
操作时,amd64 上的进程大部分时间都保持在大约 1.6g 的常驻内存使用量。