我正在使用 zlib 压缩文本数据流。文本数据以块的形式传输,每个块都会调用
自然地,
但是,一旦
是否有一种方法可以使
注: - 未知未压缩数据的总大小。如上所述,未压缩数据以块的形式传输,压缩数据也以块的形式追加到数据库字段中。 - 在 include 文件 zconf.h 中,我找到了以下注释。这也许就是我要找的吗?即
deflate()
,其中 flush 设置为 Z_NO_FLUSH
。当检索到所有块后,将使用 flush 设置为 Z_FINISH
调用 deflate()
。自然地,
deflate()
并不会在每次调用时产生压缩输出。它内部积累数据以实现高压缩率。这很好!每次 deflate()
生成压缩输出时,该输出都将追加到数据库字段中 - 这是一个缓慢的过程。但是,一旦
deflate()
生成了压缩数据,该数据可能无法适合提供的输出缓冲区 deflate_out
中。因此,需要多次调用 deflate()
。这就是我想要避免的:是否有一种方法可以使
deflate_out
总是足够大,以便每次决定生成输出时,deflate()
都可以将所有压缩数据存储在其中?注: - 未知未压缩数据的总大小。如上所述,未压缩数据以块的形式传输,压缩数据也以块的形式追加到数据库字段中。 - 在 include 文件 zconf.h 中,我找到了以下注释。这也许就是我要找的吗?即
(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.
*/
zconf.h
的注释中读到的是压缩所需的内存要求,而不是输出缓冲区的大小。话虽如此,似乎逻辑上讲,输出缓冲区的上限应该是总内存需求(以上例子中为128K+128K+"几千字节")+头部长度(40字节)。 - Eugen Rieck