Zlib

来自百合仙子's Wiki
跳转到导航 跳转到搜索

带种子的压缩

利用数据之间的相似性(比如很多数据都是 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

参考资料