Я использую zlib для сжатия потока текстовых данных. Текстовые данные поступают в куски, и для каждого фрагмента вызывается deflate()
, при установленном флажке на Z_NO_FLUSH
. После того, как все куски были извлечены, deflate()
вызывается с установленным флажком на Z_FINISH
.
Естественно, deflate()
не производит сжатый вывод для каждого вызова. Он внутренне накапливает данные для достижения высокой степени сжатия. И это прекрасно! Каждый раз, когда deflate()
создает сжатый вывод, этот вывод добавляется в поле базы данных - медленный процесс.
Однако, как только deflate()
создает сжатые данные, эти данные могут не помещаться в предоставленный выходной буфер, deflate_out
. Поэтому требуется несколько вызовов deflate()
. И этого я хочу избежать:
Есть ли способ сделать
deflate_out
всегда достаточно большим, чтобыdeflate()
мог хранить все сжатые данные в нем, каждый раз он решает произвести вывод?
Примечания:
-
Общий размер несжатых данных не известен заранее. Как упоминалось выше, несжатые данные поступают в виде фрагментов, а сжатые данные добавляются в поле базы данных, также в кусках.
-
В файле include
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 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. */