如果我有几个带有压缩zlib数据的二进制字符串,是否有一种方法可以 有效地 将它们组合成单个压缩字符串,而不需要解压缩所有内容?
我现在要做的示例:
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!
我想要的例子:
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!
我对zlib和DEFLATE算法了解不多,因此从理论上讲这可能是完全不可能的。另外,我必须使用use zlib; 因此我无法包装zlib并提出自己的协议,该协议透明地处理级联流。
注意:我不介意该解决方案在Python中不是很简单。我愿意编写一些C代码并在Python中使用ctypes。
由于您不介意使用C,因此可以从查看 gzjoin 的代码 开始 。
请注意, gzjoin 代码必须解压缩以查找合并时必须更改的部分,但不必重新压缩。这还不错,因为解压缩通常比压缩快。