【发布时间】:2015-09-04 14:01:38
【问题描述】:
我试图弄清楚是否有一种方法可以根据输入缓冲区的大小来计算输出缓冲区所需的最小大小。
这个问题和zlib, deflate: How much memory to allocate?类似,但又不一样。我是在单独询问每个块,而不是整个流。
所以假设我们有两个缓冲区:INPUT 和OUTPUT,我们有一个BUFFER_SIZE,也就是说,4096 字节。 (只是一个方便的数字,我选择这个尺寸没有特别的原因。)
如果我使用以下方法放气:
deflate(stream, Z_PARTIAL_FLUSH)
这样每个块都被压缩,并立即刷新到输出缓冲区,有没有办法可以保证输出缓冲区中有足够的存储空间而无需重新分配?
从表面上看,我们假设 DEFLATED 数据将始终大于未压缩的输入数据(假设我们使用大于 0 的压缩级别。)
当然,情况并非总是如此 - 特别是对于较小的值。例如,如果我们对单个字节进行压缩,由于 LZW 流中的标头和字典之类的开销,压缩后的数据显然会比未压缩的数据大。
考虑 LZW 的工作原理,如果我们的输入数据至少为 256 字节(这意味着最坏的情况,每个字节都是不同的,我们无法真正压缩任何东西),我们应该意识到输入大小 LESS超过 256 字节 + zlib 标头可能需要更大的输出缓冲区。
但是,一般来说,现实世界的应用程序不会像那样压缩小尺寸。因此,假设输入/输出缓冲区更像 4K,是否有某种方法可以保证输出压缩数据比输入数据小?
(另外,我知道deflateBound,但由于开销,我宁愿避免它。)
或者,换句话说,是否有一些最小缓冲区大小可以用于输入/输出缓冲区,以保证输出数据(压缩流)小于输入数据?还是总有一些病态的情况会导致输出流大于输入流,而不管大小?
【问题讨论】:
-
我很困惑。你是压缩还是解压?首先你说deflate(),也就是压缩。然后你说每个块都是“解压缩的”。于是解压。然后你说如果你不使用压缩级别0,放气的数据会更大。所以你的意思是解压缩?然后你说对于小数据大小,deflate 数据会比未压缩的流大,所以压缩。然后你问保证输出小于输入(你不能),所以压缩。
-
抱歉,我正在压缩。当我说“解压缩”时,这是一个错误(我编辑了帖子以修复。)
-
那么“表面上,我们假设 DEFLATED 数据将始终大于未压缩的输入数据”是什么意思?