【发布时间】:2012-02-12 17:55:20
【问题描述】:
我正在使用zlib 压缩文本数据流。文本数据以块的形式出现,对于每个块,调用deflate(),并将flush 设置为Z_NO_FLUSH。检索到所有块后,将调用 deflate() 并将刷新设置为 Z_FINISH。
当然,deflate() 不会在每次调用时产生压缩输出。它在内部累积数据以实现高压缩率。没关系!每次deflate() 生成压缩输出时,该输出都会附加到数据库字段 - 一个缓慢的过程。
但是,一旦deflate() 生成压缩数据,该数据可能不适合提供的输出缓冲区deflate_out。因此需要多次调用deflate()。这就是我想要避免的:
有没有办法让
deflate_out总是足够大,以便deflate()可以在每次决定产生输出时将所有压缩数据存储在其中?
注意事项:
未压缩数据的总大小不事先知道。如上所述,未压缩的数据以块的形式出现,压缩后的数据以块的形式附加到数据库字段。
-
在包含文件
zconf.h中,我找到了以下评论。这可能是我正在寻找的吗? IE。(1 << (windowBits+2)) + (1 << (memLevel+9))是deflate()可能产生的压缩数据的最大字节大小吗?/* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */
【问题讨论】:
-
@nos:这只有在输入的大小已知时才有用。
-
我读到
zconf.h中的评论是压缩的内存要求,而不是输出缓冲区的大小。也就是说,输出缓冲区的上限是总内存需求(上例中为 128K+128K+“几千字节”)+ 标头长度(40 字节),这似乎是合乎逻辑的。
标签: c performance memory zlib