Zlib
跳转到导航
跳转到搜索
带种子的压缩
利用数据之间的相似性(比如很多数据都是 Python pickle data protocol 0 格式的字典,里边有许多相同的键名),从实际数据中提取值部分,然后压缩/解压这部分数据,将 zlib 状态复制,用于压缩/解压新的数据。这样可以大幅提高短数据的压缩率。[1][2]
import zlib
class Compressor(object):
def __init__(self, seed):
c = zlib.compressobj()
d_seed = c.compress(seed)
d_seed += c.flush(zlib.Z_SYNC_FLUSH)
self.c_context = c.copy()
d = zlib.decompressobj()
d.decompress(d_seed)
while d.unconsumed_tail:
d.decompress(d.unconsumed_tail)
self.d_context = d.copy()
def compress(self, text):
c = self.c_context.copy()
t = c.compress(text)
t2 = c.flush(zlib.Z_FINISH)
return t + t2
def decompress(self, ctext):
d = self.d_context.copy()
t = d.decompress(ctext)
while d.unconsumed_tail:
t += d.decompress(d.unconsumed_tail)
return t