【问题标题】:Method of estimating DEFLATE's (zlib) current compressed size without flush估计 DEFLATE (zlib) 当前压缩大小而不刷新的方法
【发布时间】:2020-09-07 18:19:12
【问题描述】:

我目前正在编写一个程序,它接收缓存线(64 字节,但可调整),并尝试将尽可能多的缓存线放入 512 字节块中(再次可调整)。

问题是我需要能够在每次调用 deflate 后至少粗略估计当前压缩大小而不刷新。每个字节对我的目的都很重要,根据数据,尤其是考虑到我正在使用的小块大小,刷新会增加非常显着的开销。我用 Z_SYNC_FLUSH 和 Z_PARTIAL_FLUSH 尝试了各种不同的实现,但两者都增加了很多开销才能始终如一地有用。

我目前的幼稚方法是压缩 9 个缓存线(576 字节)并检查它是否适合 512 块,如果适合,则添加另一个缓存线并重新压缩整个缓冲区等等。如果前 9 个缓存行无法放入 512 块中,则它只是存储未压缩(原始未压缩)。

您可以想象这种方法需要很长时间,使用这种方法压缩一个 7gb 的文件需要将近 3 个小时。

我注意到 z_stream 结构有一个我可以公开的内部状态,但我没有找到任何明显的方法来利用它来获得估计。我认为这是因为在刷新之前没有实际发生压缩。

在实际刷新之前,有没有办法获得压缩输出的估计大小? 如果没有,我可以做些什么来减少当前方法的时间开销?

【问题讨论】:

    标签: c compression zlib deflate


    【解决方案1】:

    查看fitblk.c 的一种方法。它的开销约为 3 倍,因为它每个块执行 3 次压缩。

    基本思想是首先压缩到足以填满所需的块。然后解压缩,直到您处理适合所需块的压缩数据量,然后仅压缩该块。第二遍可以优化拟合。

    【讨论】:

    • 我真的很感激这个,看起来我可以稍微修改一下以完美地满足我的需求。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多