我正在使用zlib來壓縮文本數據流。文本數據以塊形式顯示,並且對於每個塊,調用deflate()
,並將刷新設置爲Z_NO_FLUSH
。一旦檢索到所有塊,則調用deflate()
並將flush設置爲Z_FINISH
。zlib,deflate:要分配多少內存?
自然地,deflate()
在每次調用時都不會產生壓縮輸出。它在內部累積數據以實現高壓縮率。那很好!每當deflate()
產生壓縮輸出時,該輸出都附加到數據庫字段 - 一個緩慢的過程。
但是,一旦deflate()
產生壓縮數據,該數據可能不適合提供的輸出緩衝區deflate_out
。因此需要撥打deflate()
的多個電話。這就是我想要的東西,以避免:
有沒有一種方法,使
deflate_out
總是足夠大,以便deflate()
可以存儲在它所有的壓縮數據,它決定產生輸出每一個時間?
注:
未壓縮數據的總大小是不事先知道的。如上所述,未壓縮的數據以塊的形式出現,壓縮的數據也以塊的形式附加到數據庫字段。
在包含文件
zconf.h
中,我發現了以下評論。這可能是我在找什麼?即(1 << (windowBits+2)) + (1 << (memLevel+9))
deflate()
可能產生的壓縮數據的最大字節數是多少?/* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */
查看http://stackoverflow.com/questions/4936255/zlib-how-to-dimension-avail-out – nos 2012-01-17 23:17:00
@nos:這只是有用的,如果輸入的大小是已知的。 – 2012-01-17 23:19:22
我讀'zconf.h'中的註釋是壓縮的內存要求,而不是輸出緩衝區的大小。 這就是說,它似乎是合乎邏輯,即一個上界輸出緩衝器是總的內存要求(128K + 128K +「幾千字節」在上面的例子)+標題長度(40字節)。 – 2012-01-17 23:29:51