任何主流压缩算法(例如snappy,zlib或bzip本身是否支持网络上的流数据?例如,如果我必须发送压缩的有效负载,那么在发送消息之前我是否必须手动预先设置有效负载的大小?或者是否有任何库提供API来判断消息是否在给定x
个字节的情况下完成?
答案 0 :(得分:2)
zlib,bzip2,lz4,zstd,brotli,lzma2以及其他许多人都通过在压缩数据中使用数据结束标记来支持流式传输。
碰巧,你提到的其中一个,snappy,在你问的意义上是不可流动的,因为格式以未压缩的大小开始。
答案 1 :(得分:1)
Zstd。有一个ZSTD_compressStream()/ ZSTD_decompressStream()API。
请参阅https://github.com/facebook/zstd/tree/dev/examples。
下面的伪代码:
// Create stream
ZSTD_CStream* const cstream = ZSTD_createCStream();
// Init stream
size_t const initResult = ZSTD_initCStream(cstream, cLevel);
size_t read, toRead;
while((read = fread(buffer, 1, toRead, file)) ) {
ZSTD_inBuffer input = { buffIn, read, 0 };
// Process next chunk
while (input.pos < input.size) {
ZSTD_outBuffer output = { buffOut, buffOutSize, 0 };
// Compress Data
toRead = ZSTD_compressStream(cstream, &output , &input);
[...]
fwrite_orDie(buffOut, output.pos, fout);
}
}
ZSTD_outBuffer output = { buffOut, buffOutSize, 0 };
// End stream
ZSTD_endStream(cstream, &output);
[...]
// Free stream
ZSTD_freeCStream(cstream);
答案 2 :(得分:1)
还有DEFLATE(zlib兼容)无状态SLZ用于流式传输(仅限压缩)到每个流的状态内存减少的许多客户端:http://www.libslz.org/&#34;无状态ZIP库 - SLZ&#34;:
SLZ是一种快速且无内存的流压缩器,可产生可通过zlib或gzip解压缩的输出。它根本没有实现解压缩,zlib对此非常好。 目的是在需要zlib兼容流的情况下使用SLZ,并且zlib的资源使用率太高而压缩率并不重要。典型的用例是HTTP服务器和网关,它们必须以很少的CPU资源并行压缩许多流来分配给这个任务,而不必因为内存使用而压缩压缩率。在这样的环境中,服务器的内存使用量可以轻松地除以10,CPU使用率可以除以3.此外,它的高性能使其填补了网络备份应用程序的空白。
虽然zlib每个流使用256 kB内存以及流描述符本身的几十个字节,但SLZ仅存储由28个字节组成的流描述符。因此,它特别适用于必须处理数十到数十万个并发流的环境。
zlib和SLZ之间的关键区别在于SLZ是无状态的,因为它不会将先前压缩的数据视为其字典的一部分。当它以足够大的块(至少几个kB一次)馈送时,它不会损害压缩性能