【问题标题】:zlib inflate CHUNK size has to be the same as the size used in deflation?zlib inflate CHUNK 大小必须与通货紧缩中使用的大小相同?
【发布时间】:2013-06-11 18:43:44
【问题描述】:

我按照http://zlib.net/zlib_how.html 中的 zlib inflate 示例解压缩了一个压缩文件。即使在我将 CHUNK 大小定义为 256KB 之后,我看到每个 inflate() 函数调用的输出数据也只有 8KB。我知道压缩文件是通过使用 8K 大小的 CHUNK 来压缩的,那么这是否意味着 zlib inflate 的 CHUNK 大小必须与 deflation 中使用的大小相同?

如果是,在不改变源文件的情况下,有没有办法加快解压速度?使用 8K 大小的 CHUNK 解压缩速度很慢。

【问题讨论】:

    标签: zlib inflate


    【解决方案1】:

    不,块大小不必相同。一个有效的 deflate 流可以通过使用任何块大小的 inflate 来解码。

    即使我将 CHUNK 大小定义为 256KB,我看到的输出数据 每个 inflate() 函数调用只有 8KB。

    根据 cmets 中的讨论,您没有单个 deflate 流,而是一系列小 deflate 流的串联。进行充气,每次完成一个流时,您都需要简单地重新启动充气过程,这由Z_STREAM_END 指示,由inflate() 返回。使用inflateReset() 而不是inflateEnd(),后跟inflateInit(),因为这样可以节省时间并避免不必要的释放和内存分配。

    除此之外没有办法加快解压速度。

    【讨论】:

    • 谢谢马克。我正在尝试调试我的问题。我在代码中看到的是 CHUNK 大小是 256KB。在 inflate() 调用之前,avail_in 为 54K 数据,avail_out 为 256K;调用 inflate() 后,avail_in 为 53K 数据,avail_out 为 (256 - 8)K。基本上只用inflate()解压1K数据,只生成8K数据。所以它会退出内部循环,因为avail_out!=0。仍在试图弄清楚为什么不是所有输入数据都被解压缩。
    • 那么错误不在您的程序中,而是在您期望获得单个放气流的情况下。 Z_STREAM_END 意味着inflate() 到达放气流的末尾并停止,这是应该的。这个问题是什么?它是另一个放气流吗?还有什么?
    • 但我认为这个流至少应该解压缩整个 54K 数据(因为avail_in 是 54K)然后返回 Z_STREAM_END。我从zlib.net/zlib_how.html 的示例中了解到,当提供 CHUNK 大小数据时,内部循环会将整个 CHUNK 大小数据解压缩到 out 直到avail_out ==0。这是一个放气流,对吧?抱歉,如果我误解了整个概念。
    • 我在groups.google.com/forum/?fromgroups#!topic/comp.compression/… 找到了您的答案。我想我有同样的问题。 (来自 Mark Adler “就像第一次一样再次运行 inflate 并从上次中断的地方继续。您有一个文件是一系列 gzip 流的串联。这是标准允许的,并由gzip 和 zlib 中的 gz* 函数。要重新启动 inflate,请使用 inflateReset() 代替 inflateEnd() 和 inflateInit2(),以避免不必要的内存释放和重新分配。"
    • 所以我的源文件是一系列 zlib 原始大小 8K 流的串联。很高兴我可以按照 Mark 的建议再次运行 inflate,但是有没有在不更改源文件的情况下加快解压速度,这是我的最终目标?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2017-05-30
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多