我有一个内存和磁盘受限的环境,我需要解压缩以字符串为基础的块(通过xmlrpc二进制传输)发送给我的gzip文件的内容。但是,使用zlib.decompress()或zlib.decompressobj()/ decompress()都可以在gzip标头上使用barf。我已经尝试过偏移gzip标头(在此处记录),但是仍然没有避免使用barf。gzip库本身似乎仅支持从文件解压缩。
以下代码段简化了我想做的事情(在现实生活中,缓冲区将从xmlrpc填充,而不是从本地文件读取):
#! /usr/bin/env python import zlib CHUNKSIZE=1000 d = zlib.decompressobj() f=open('23046-8.txt.gz','rb') buffer=f.read(CHUNKSIZE) while buffer: outstr = d.decompress(buffer) print(outstr) buffer=f.read(CHUNKSIZE) outstr = d.flush() print(outstr) f.close()
不幸的是,正如我说的那样,此选项带有:
Traceback (most recent call last): File "./test.py", line 13, in <module> outstr = d.decompress(buffer) zlib.error: Error -3 while decompressing: incorrect header check
从理论上讲,我可以将来自xmlrpc的数据馈入StringIO,然后将其用作gzip.GzipFile()的fileobj,但是,在现实生活中,我也没有可用的内存来将整个文件内容保存在内存中作为解压缩的数据。我确实确实需要逐块处理它。
退路是将我的xmlrpc数据压缩从gzip更改为纯zlib,但是由于这会影响其他子系统,因此我希望尽可能避免这种情况。
有任何想法吗?
gzip和zlib使用略有不同的标头。
尝试d = zlib.decompressobj(16+zlib.MAX_WBITS)。
d = zlib.decompressobj(16+zlib.MAX_WBITS)
并且CHUNKSIZE=1024出于可能的性能原因,您可以尝试将块大小更改为2的幂(例如)。
CHUNKSIZE=1024