linux 重用压缩字典

u0njafvf  于 2023-03-22  发布在  Linux
关注(0)|答案(3)|浏览(123)

有没有压缩工具可以让你把字典(或类似的东西)从压缩输出中分离出来,这样字典就可以在后续的压缩中重复使用?这个想法是一次性传输字典,或者在远程站点使用参考字典,并使压缩文件更小以便于传输。
我看了很多常用的压缩工具的文档,但是我真的找不到一个支持这个的,但是大多数常用的压缩工具都不是直接的字典压缩。
我想象的用法是:

compress_tool --dictionary compressed.dict -o compressed.data uncompressed
decompress_tool --dictionary compressed.dict -o uncompressed compressed.data

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

33qvvth1

33qvvth11#

预设字典对于那么大的文件并没有多大用处,对于小数据(比如压缩数据库中的字段、RPC查询/响应、XML或JSON的片段等)非常有用,但是对于像你这样的大文件,算法会很快建立自己的字典。
也就是说,碰巧我最近在Squash中使用了预置字典,我确实有一些代码,它们做的和你在zlib插件中所讨论的差不多。(如果我决定支持预设字典,我会考虑使用不同的API),但我只是把它推到'deflate-dictionary-file'分支,如果你想看一下。

squash -ko dictionary-file=foo.dict -c zlib:deflate uncompressed compressed.deflate

为了减压

squash -dko dictionary-file=foo.dict -c zlib:deflate compressed.deflate decompressed

AFAIK zlib中没有任何东西支持构建字典-你必须自己做。zlib文档描述了“格式”:
字典应该由字符串(字节序列)组成,这些字符串可能会在稍后的压缩数据中遇到,最常用的字符串最好放在字典的末尾。然后可以比使用默认空字典更好地压缩数据。
为了测试,我使用了这样的东西(YMMV):

cat input | tr ' ' '\n' | sort | uniq -c | awk '{printf "%06d %s\n",$1,$2}' | sort | cut -b8- | tail -c32768
zkure5ic

zkure5ic2#

我创建dicflate正是为了这个目的:https://github.com/hrobeers/dicflate

dicflate -d compressed.dict < uncompressed > compressed.data
dicflate -x -d compressed.dict < compressed.data > uncompressed
hmae6n7t

hmae6n7t3#

zstandard二进制zstd支持以下开箱即用的特性:https://github.com/facebook/zstd#dictionary-compression-how-to

相关问题