2017-06-10 55 views
0

是否有任何主流壓縮算法,例如snappy,zlibbzip本地支持跨網絡流數據?例如,如果我必須發送一個壓縮的有效負載,那麼在發送消息之前,我是否必須手動預先確定有效負載的大小?或者是否有任何庫提供API來告知郵件是否完整,並給出x字節?是否有任何主流壓縮算法本地支持流數據

+0

幾乎根據定義,流媒體API將無法跟蹤消息邊界。這是來電者的責任。 –

+0

@JamesKPolk那麼人們在消息之前編碼消息大小的常用方式是什麼?手動整數編碼? – Curious

+1

如果只有一條消息,那麼您可以閱讀,直到邏輯EOF。否則,您可以前綴一個整數,或使用一些獨特的分隔符。 –

回答

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

謝謝!您是否介意以允許您流式傳輸的API的要點更新您的答案?這個例子很難解析,我覺得我會錯過一些關鍵點,如果我自己進行推理 – Curious

+0

不知道這是你在找什麼,但我編輯了一些包含不同步驟進行壓縮的僞代碼的答案帶有流式API的緩衝區(來自示例)。 – flanglet

+0

對不起,我之前並不清楚。我一直在尋找一種方法來解壓縮數據後,不知道它包含什麼或有多少數據傳入。 – Curious

1

另外也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_壓縮線程的情況下減少內存使用量,儘管以壓縮效率爲代價。 –

2

zlib的,bzip2的,LZ4,zstd,brotli,LZMA2,和許多其他人都支持通過流在壓縮數據中使用數據結束標記。

碰巧,您提到的其中一個活潑的,在您提出的意義上不是流式,因爲格式以未壓縮的大小開始。