【发布时间】:2011-01-26 07:15:24
【问题描述】:
我有一个内存和磁盘受限的环境,我需要解压缩以基于字符串的块(通过 xmlrpc 二进制传输)发送给我的 gzip 文件的内容。但是,使用 zlib.decompress() 或 zlib.decompressobj()/decompress() 两者都会对 gzip 标头产生影响。我尝试过抵消 gzip 标头(记录在 here),但仍然无法避免出现问题。 gzip 库本身似乎只支持从文件解压缩。
下面的 sn-p 给出了我想做的简化说明(除了在现实生活中缓冲区将由 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,但由于这会影响其他子系统,我希望尽可能避免它。
有什么想法吗?
【问题讨论】: