私はzlibを使用してテキストデータのストリームを圧縮しています。テキストデータはチャンクになり、チャンクごとにdeflate()
が呼び出され、フラッシュはZ_NO_FLUSH
に設定されます。一度すべてのチャンクが取得されると、deflate()
が呼び出され、フラッシュはZ_FINISH
に設定されます。zlib、deflate:割り当てるメモリ量は?
もちろん、deflate()
は、各呼び出しで圧縮出力を生成しません。高い圧縮率を達成するために内部的にデータを蓄積します。そしてそれは大丈夫です! deflate()
が圧縮出力を生成するたびに、その出力はデータベースフィールドに追加されます。
ただし、deflate()
が圧縮データを生成すると、そのデータは提供された出力バッファに収まらない可能性があります。deflate_out
したがって、deflate()
へのいくつかの呼び出しが必要です。
は
deflate()
はその中のすべての圧縮データを格納できるように、十分なdeflate_out
が常に大にする方法はあり、それは出力を生成することを決定し、すべての回:そして、それは私が避けたいものですか?
注
非圧縮データの合計サイズが事前知りません。上記のように、圧縮されていないデータはチャンクになり、圧縮されたデータはデータベースのフィールドにもチャンクで付加されます。
インクルードファイル
zconf.h
に次のコメントがあります。それはおそらく私が探しているものですか?私。deflate()
が生成する圧縮データの最大サイズ(バイト単位)は(1 << (windowBits+2)) + (1 << (memLevel+9))
ですか?ヒントのためのソースを見ながら/* 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
@nosを参照してください。これは、入力のサイズがわかっている場合にのみ役に立ちます。 –
出力バッファのサイズではなく、圧縮のためのメモリ要件として 'zconf.h'のコメントを読んでいます。 出力バッファの上限は、合計メモリ要件(上記の例では128K + 128K +「数キロバイト」)+ヘッダー長(40バイト)です。 –