【发布时间】: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