【问题标题】:Reusing compression dictionary重用压缩字典
【发布时间】:2014-07-24 11:33:18
【问题描述】:

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

我查看了一堆常用压缩工具的文档,但我真的找不到支持它的工具。但最常见的压缩工具并不是直接的字典压缩。

我想象的用法是:

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' 在目标上重建的信息。

【问题讨论】:

  • 您是如何认为 F 和 F' 相似的?我的意思是您的二进制差异工具确定 F 和 F' 有很大差异,因此压缩字典可能有很大差异。因此,我认为重用字典效果不佳,即使有可以重用它的软件。
  • @ymonad 你说得对,我不知道字典是否相似。我只是感觉 F 和 F' 相似,但二进制差异工具的工作方式与压缩工具不同,所以我正在探索选项。唯一确定的方法是我是否能找到可以做到这一点的工具。

标签: linux compression


【解决方案1】:

预设字典对于这种大小的文件并没有真正的用处。它们非常适合小数据(想想压缩数据库中的字段、RPC 查询/响应、XML 或 JSON 的 sn-ps 等),但对于像您这样的大文件,算法会非常快速地建立自己的字典。

也就是说,我最近在Squash 中使用预设字典,而且我确实有一些代码几乎可以完成您所说的 zlib 插件。我不会将它推送到 master(如果我决定支持预设字典,我会考虑使用不同的 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

【讨论】:

  • 这看起来很有希望。碰巧我现在正在使用 MapReduce 来构建我自己的文件之间共享字节序列的字典,以确定任何类型的字典是否会有所帮助。好像我可以把它喂回壁球。我明天会玩这个-谢谢!
【解决方案2】:

我专门为此目的创建了 dicflate:https://github.com/hrobeers/dicflate

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多