我正在寻找一个具有任意大字典(和“块大小”)的压缩工具。让我通过例子来解释一下。
首先让我们创建 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