是否有任何主流压缩算法本地支持流数据
是否有任何主流压缩算法,例如snappy,zlib或bzip本地支持跨网络流数据?例如,如果我必须发送一个压缩的有效负载,那么在发送消息之前,我是否必须手动预先确定有效负载的大小?或者是否有任何库提供API来告知邮件是否完整,并给出x
字节?是否有任何主流压缩算法本地支持流数据
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);
另外也DEFLATE(zlib的兼容)无国籍SLZ流媒体(仅压缩 - ),以每流减少的状态存储的众多客户:http://www.libslz.org/“无国籍ZIP库 - SLZ“:
SLZ是一种快速无记忆流式压缩器,它可以产生可以用zlib或gzip解压缩的输出。它根本没有实现解压缩,zlib对此完全没问题。 目的是在需要兼容zlib的流并且zlib的资源使用率过高而压缩比不是关键的情况下使用SLZ。典型的用例是在HTTP服务器和网关中,这些服务器和网关必须并行压缩多个数据流,只需很少的CPU资源就可以分配给该任务,而不必因存储器使用率而影响压缩比。在这样的环境下,服务器的内存使用量可以很容易地被10除以及CPU使用率除以3.此外,其高性能使其填补了网络备份应用程序的空白。
虽然除了流描述符本身以外,zlib还为每个流使用256 kB的内存,而SLZ仅存储由28个字节组成的流描述符。因此它特别适合需要处理数十到数十万个并发流的环境。
zlib和SLZ之间的主要区别在于SLZ是无状态的,因为它不会将先前压缩的数据视为其字典的一部分。它没有伤害的压缩性能,当它在足够大的数据块被送到(至少几KB一次)
zlib(deflate)支持按原样流式传输。 “无状态”业务仅仅是为了在_many_压缩线程的情况下减少内存使用量,尽管以压缩效率为代价。 –
zlib的,bzip2的,LZ4,zstd,brotli,LZMA2,和许多其他人都支持通过流在压缩数据中使用数据结束标记。
碰巧,您提到的其中一个活泼的,在您提出的意义上不是流式,因为格式以未压缩的大小开始。
几乎根据定义,流媒体API将无法跟踪消息边界。这是来电者的责任。 –
@JamesKPolk那么人们在消息之前编码消息大小的常用方式是什么?手动整数编码? – Curious
如果只有一条消息,那么您可以阅读,直到逻辑EOF。否则,您可以前缀一个整数,或使用一些独特的分隔符。 –