是否有任何主流压缩算法本地支持流数据

问题描述:

是否有任何主流压缩算法,例如snappy,zlibbzip本地支持跨网络流数据?例如,如果我必须发送一个压缩的有效负载,那么在发送消息之前,我是否必须手动预先确定有效负载的大小?或者是否有任何库提供API来告知邮件是否完整,并给出x字节?是否有任何主流压缩算法本地支持流数据

+0

几乎根据定义,流媒体API将无法跟踪消息边界。这是来电者的责任。 –

+0

@JamesKPolk那么人们在消息之前编码消息大小的常用方式是什么?手动整数编码? – Curious

+1

如果只有一条消息,那么您可以阅读,直到逻辑EOF。否则,您可以前缀一个整数,或使用一些独特的分隔符。 –

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); 
+0

谢谢!您是否介意以允许您流式传输的API的要点更新您的答案?这个例子很难解析,我觉得我会错过一些关键点,如果我自己进行推理 – Curious

+0

不知道这是你在找什么,但我编辑了一些包含不同步骤进行压缩的伪代码的答案带有流式API的缓冲区(来自示例)。 – flanglet

+0

对不起,我之前并不清楚。我一直在寻找一种方法来解压缩数据后,不知道它包含什么或有多少数据传入。 – Curious

另外也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一次)

+1

zlib(deflate)支持按原样流式传输。 “无状态”业务仅仅是为了在_many_压缩线程的情况下减少内存使用量,尽管以压缩效率为代价。 –

zlib的,bzip2的,LZ4,zstd,brotli,LZMA2,和许多其他人都支持通过流在压缩数据中使用数据结束标记。

碰巧,您提到的其中一个活泼的,在您提出的意义上不是流式,因为格式以未压缩的大小开始。