Estoy usando zlib para comprimir una secuencia de datos de texto. Los datos de texto vienen en fragmentos, y para cada fragmento, se llama a deflate()
, con el conjunto de color a Z_NO_FLUSH
. Una vez que se han recuperado todos los fragmentos, se llama al deflate()
con el juego de color a Z_FINISH
.zlib, deflate: ¿Cuánta memoria asignar?
Naturalmente, deflate()
no produce salida comprimida en cada llamada. Internamente acumula datos para lograr una alta tasa de compresión. ¡Y eso está bien! Cada vez que deflate()
produce una salida comprimida, esa salida se agrega a un campo de base de datos, un proceso lento.
Sin embargo, una vez que deflate()
produce datos comprimidos, es posible que esos datos no quepan en el búfer de salida proporcionado, deflate_out
. Por lo tanto, se requieren varias llamadas al deflate()
. Y eso es lo que quiero evitar:
¿Hay una manera de hacer
deflate_out
siempre lo suficientemente grande como para quedeflate()
puede almacenar todos los datos comprimidos en el mismo, cada momento que decida producir una salida?
Notas:
El tamaño total de los datos sin comprimir es no conocido de antemano. Como se mencionó anteriormente, los datos descomprimidos vienen en fragmentos, y los datos comprimidos se anexan a un campo de base de datos, también en fragmentos.
En el archivo de inclusión
zconf.h
he encontrado el siguiente comentario. ¿Es eso quizás lo que estoy buscando? Es decir. es(1 << (windowBits+2)) + (1 << (memLevel+9))
el tamaño máximo en bytes de datos comprimidos quedeflate()
puede producir?/* 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. */
Consulte http://stackoverflow.com/questions/4936255/zlib-how-to-dimension-avail-out – nos
@nos: Esto solo es útil, si se conoce el tamaño de la entrada. –
Leí el comentario en 'zconf.h' para que sea el requisito de memoria para la compresión, no el tamaño del buffer de salida. Dicho esto, parece lógico, que un límite superior para el búfer de salida sea el total de requisitos de memoria (128K + 128K + "algunos kilobytes" en el ejemplo anterior) + longitud del encabezado (40 bytes). –