C++ zlib compress()产生糟糕的压缩率

C++ zlib compress()产生糟糕的压缩率,c++,zlib,C++,Zlib,我想使用compress zlib函数压缩数据,因此,代码如下所示: ifs.read(srcBuf,srcLen) // std::ifstream, srcLen = 256kb compress(dstBuf, &dstLen, srcBuf, srcLen); // casts are omitted ofs.write(dstBuf, dstLen); // std::ofstream dstLen = dstBufSize; 结果文件比原始文件(380mb对360mb)小约

我想使用compress zlib函数压缩数据,因此,代码如下所示:

ifs.read(srcBuf,srcLen) // std::ifstream, srcLen = 256kb
compress(dstBuf, &dstLen, srcBuf, srcLen); // casts are omitted
ofs.write(dstBuf, dstLen); // std::ofstream
dstLen = dstBufSize;
结果文件比原始文件(380mb对360mb)小约4%,这实际上非常糟糕。 同时,Winrar将该文件压缩为70mb文件。我尝试过bzip2和zlib,它们都提供了类似的结果。我想问题是256KB的缓冲区太小了,但我想了解它是如何工作的,以及如何使用zlib来实现更好的压缩。 总的来说,我想使用低级工具将几个文件压缩成一个大文件供内部使用,compress()看起来非常适合,但是


非常欢迎深入的解释。提前感谢。

使用
deflateInit()
deflate()
deflateEnd()
而不是
compress()
。我不知道这是否会改善压缩效果,因为您没有提供有关数据的任何信息,并且只提供了关于您的程序做什么的最细微的线索(这些行在循环中吗?)。但是,如果您正在压缩一些大的内容,而不是一次性加载到内存中,那么您就不会使用
compress()

我相信您的问题在于,通过使用compress()函数(而不是deflateInit()/deflate()/deflateEnd()),您没有充分利用zlib的压缩能力

这里的关键洞察是zlib压缩是由实现的,这是一种字典类型的数据结构,它指定了简短的“标记”,简洁地表示较长的输入字节序列。这样,只要这些较长的序列稍后在输入流中重复,它们就可以在输出流中被它们的等价令牌替换,从而大大减少压缩数据的总大小

然而,该过程的效率在很大程度上取决于构建的哈夫曼树的持久性,而这又取决于您的程序在整个压缩过程中保持deflate算法的状态。但是,您的代码正在调用compress(),这是一个针对少量数据的单次便利函数,因此compress()不提供任何方法让您的程序在多次调用时保持状态。每次调用compress()时,都会生成一个全新的哈夫曼树,写入用于传递给该调用的其余数据的输出流,然后被遗忘——后续任何compress()调用都无法访问该树。这很可能是你看到的效率低下的根源

修复方法是在需要在多个步骤中压缩数据的情况下不使用compress()。相反,可以调用deflateInit()(为算法分配状态),然后多次调用deflate()(使用压缩数据并更新该状态),最后调用deflateEnd()进行清理。

尝试以下操作:看看它是否工作正常。。使用
Z_BEST_COMPRESSION
作为压缩级别。