重用压缩字典

Jar*_*edC 5 linux compression

是否有一个压缩工具可以让您将其字典(或类似的)与压缩输出分开输出,以便可以在后续压缩中重复使用该字典?这个想法是一次性传输字典,或者在远程站点使用参考字典,并使压缩文件更小以便传输。

我查看了一堆常见压缩工具的文档,但我确实找不到支持此功能的工具。但最常见的压缩工具并不是直接的字典压缩。

我想象的用法是:

compress_tool --dictionary compressed.dict -o compressed.data uncompressed
decompress_tool --dictionary compressed.dict -o uncompressed compressed.data
Run Code Online (Sandbox Code Playgroud)

为了扩展我的用例,我有一个 500MB 的二进制文件 FI 想通过慢速网络复制。仅压缩该文件就会产生 200MB 的大小,这仍然比我想要的要大。然而,我的源和目标都有一个文件 F',它与 F 非常相似,但差异很大,以至于二进制差异工具无法正常工作。我在想,如果我在两个站点上压缩 F',然后重新使用有关该压缩的信息来压缩源上的 F,我可能会从传输中消除一些可以使用 F' 在目标上重建的信息。

nem*_*equ 3

预设字典对于这种大小的文件来说并不是很有用。它们非常适合小数据(例如压缩数据库中的字段、RPC 查询/响应、XML 或 JSON 片段等),但对于像您这样的较大文件,算法会非常快速地构建自己的字典。

也就是说,碰巧我最近在Squash中使用预设词典,并且我确实有一些代码可以完成您所谈论的 zlib 插件的功能。我不会将其推送到 master(如果我决定支持预设词典,我会考虑使用不同的 API),但如果您想采用,我只是将其推送到“deflate-dictionary-file”分支看。要压缩,请执行类似的操作

squash -ko dictionary-file=foo.dict -c zlib:deflate uncompressed compressed.deflate
Run Code Online (Sandbox Code Playgroud)

为了解压,

squash -dko dictionary-file=foo.dict -c zlib:deflate compressed.deflate decompressed
Run Code Online (Sandbox Code Playgroud)

AFAIK zlib 中没有任何东西支持构建字典——你必须自己做。zlib 文档描述了“格式”:

字典应由稍后可能在要压缩的数据中遇到的字符串(字节序列)组成,最常用的字符串最好放在字典的末尾。当要压缩的数据很短并且可以很准确地预测时,使用字典是最有用的;与默认的空字典相比,可以更好地压缩数据。

为了进行测试,我使用了这样的东西(YMMV):

cat input | tr ' ' '\n' | sort | uniq -c | awk '{printf "%06d %s\n",$1,$2}' | sort | cut -b8- | tail -c32768
Run Code Online (Sandbox Code Playgroud)