mysql业务表中有一个字段longtext类型,数据太大,所以决定使用zlib压缩之后存储到mysql中。在存入的时候,使用zlib.compress进行压缩,在查询的时候,使用zlib.decompress进行解压缩。
压缩:
compressed_data = zlib.compress(data.encode("utf-8"))
data = base64.b64encode(compressed_data)
解压缩
data = zlib.decompress(base64.b64decode(data))
data = data.decode(encoding='utf-8')
问题出在zlib.decompress的时候,执行抛出异常:
zlib.error: Error -5 while decompressing data: incomplete or truncated stream
原因:
数据的大小超过了可以存储在内存的大小。
解决:
使用compressobj,compressobj返回一个压缩对象,用来压缩不能一下子读入内存的数据流。它通过缓冲流并将其以可管理的块的形式输入到解压缩器来处理流。
代码:
zobj = zlib.decompressobj()
data = zobj.decompress(base64.b64decode(workflowDetail.origin_data))
data = data.decode(encoding='utf-8')
总结:
字符串:使用zlib.compress可以压缩字符串。使用zlib.decompress可以解压字符串。
数据流:压缩:compressobj,解压:decompressobj
搞了一个公众号PostgreSQL运维技术,欢迎来踩~
悄悄放一张:
PostgreSQL运维技术