Concatene múltiples flujos de datos comprimidos de zlib en un solo flujo de manera eficiente

Si tengo varias cadenas binarias con datos comprimidos de zlib, ¿hay alguna forma de combinarlas de manera eficiente en una sola cadena comprimida sin descomprimir todo?

Ejemplo de lo que tengo que hacer ahora:

c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ") c2 = zlib.compress("We ride at dawn! ") c = zlib.compress(zlib.decompress(c1)+zlib.decompress(c2)) # Warning: Inefficient! d1 = zlib.decompress(c1) d2 = zlib.decompress(c2) d = zlib.decompress(c) assert d1+d2 == d # This will pass! 

Ejemplo de lo que quiero:

 c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ") c2 = zlib.compress("We ride at dawn! ") c = magic_zlib_add(c1+c2) # Magical method of combining compressed streams d1 = zlib.decompress(c1) d2 = zlib.decompress(c2) d = zlib.decompress(c) assert d1+d2 == d # This should pass! 

No sé mucho sobre zlib y el algoritmo DEFLATE, por lo que esto puede ser completamente imposible desde un punto de vista teórico. Además, debo usar use zlib; así que no puedo envolver zlib y crear mi propio protocolo que maneje de forma transparente los flujos concatenados.

NOTA: Realmente no me importa si la solución no es trivial en Python. Estoy dispuesto a escribir algunos códigos C y usar ctypes en Python.

Ya que no te importa aventurarte en C, puedes comenzar mirando el código para gzjoin .

Tenga en cuenta que el código gzjoin debe descomprimirse para encontrar las partes que deben cambiarse cuando se fusionan, pero no es necesario volver a comprimirlas. Eso no es tan malo porque la descompresión suele ser más rápida que la compresión.

Además de gzjoin, que requiere la descompresión del primer flujo de desinflado, puede echar un vistazo a gzlog.h y gzlog.c , que agrega de manera eficiente cadenas cortas a un archivo gzip sin tener que descomprimir el flujo de desinflado cada vez. (Se puede modificar fácilmente para operar con datos de desinflado envueltos en zlib en lugar de datos de desinflado envueltos con gzip). Usted usaría este enfoque si tiene el control de la creación del primer flujo de desinflado. Si no está creando el primer flujo de desinflado, entonces tendría que usar el enfoque de gzjoin que requiere descompresión.

Ninguno de los enfoques requiere recompresión.