我有一个内存和磁盘有限的环境,在这个环境中,我需要以基于字符串的块(通过xmlrpc二进制传输)来解压缩发送给我的gzip文件的内容。但是,在gzip头上使用zlib.decompress()或zlib.decompressobj()/decompress()两个barf。我已经尝试过通过gzip头(文档化的here)进行偏移,但仍然未能避免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.gzip file()的fileobj,然而,在现实生活中,我没有足够的内存来将整个文件内容以及解压缩的数据保存在内存中。我真的需要一块一块地处理它。
回退的方法是将xmlrpc源数据的压缩从gzip改为纯zlib,但是由于这会影响到其他子系统,所以如果可能的话,我宁愿避免它。
有什么想法吗?
我这里有一个更详细的答案:https://stackoverflow.com/a/22310760/1733117
per documentation this automatically detects the header (zlib or gzip)。
gzip和zlib使用稍有不同的头。
见How can I decompress a gzip stream with zlib?
尝试
d = zlib.decompressobj(16+zlib.MAX_WBITS)
。出于可能的性能原因,您可以尝试将块大小更改为2的幂(例如
CHUNKSIZE=1024
)。相关问题 更多 >
编程相关推荐