Я использую zlib для сжатия потока текстовых данных. Текстовые данные поступают фрагментами, и для каждого фрагмента вызывается deflate()
, для сброса которого установлено значение Z_NO_FLUSH
. После получения всех фрагментов вызывается deflate()
с установленным для сброса значением Z_FINISH
.
Естественно, 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. */
zconf.h
указывает на требования к памяти для сжатия, а не на размер выходного буфера. Тем не менее, кажется логичным, что верхняя граница для выходного буфера - это общие требования к памяти (128 КБ + 128 КБ + несколько килобайт в приведенном выше примере) + длина заголовка (40 байт). - person Eugen Rieck   schedule 18.01.2012