gzip出现OverflowError错误: 大小超出无符号整型范围

4

环境:Windows,Python 3.4.1,64位版本。

我尝试像这样使用pickle和gzip保存数据:

with gzip.open(filename, 'rb') as f:
    pickle.dump(data,f)

数据可以成功转储而不使用gzip,但是使用gzip时会引发异常,如下所示:
File "C:\Python34\lib\gzip.py", line 344, in write
  self.fileobj.write( self.compress.compress(data) )
OverflowError: Size does not fit in an unsigned int

我追溯了代码,发现gzip实际上是建立在zlib之上的。在通过谷歌搜索这个问题后,我找到了这个页面 http://bugs.python.org/file32715/zlib_64bit-4.patch。似乎对无符号整数类型有长度限制。
所以,我的问题是,有没有什么方法可以弥补这个bug或绕过它?

除了执行流式压缩之外,还有其他操作吗? - Ignacio Vazquez-Abrams
数据有多大,以及在您的架构中无符号整数的大小是多少? - Mark Adler
把 C 代码翻译成 Python,这是一个相当糟糕的、有些懒惰的回应。相反,代码应该将输入分成 UINT_MAX 部分,直到全部消耗完为止。 - Mark Adler
@MarkAdler:数据大小约为5.1GB。 - Jedi
而且我猜您的机器上int的大小是32位。那么,实际上您的问题是由Python库代码中的漏洞引起的。您将不得不按照augurar的描述进行解决。但是,您可以使用更大的块大小。实际上,在这种特定情况下,您只需要两个块。 - Mark Adler
1个回答

1

你可以尝试将gzip文件包装在一个写入器中,将数据分成给定最大大小的块。以下是示意图:

class ChunkedWriter(object):
    def __init__(self, file, chunksize=65536):
        self.file = file
        self.chunksize = chunksize

    def write(self, data):
        mdata = memoryview(data)
        for i in range(0, len(mdata), self.chunksize):
            self.file.write(bytes(mdata[i:i+self.chunksize]))

我不确定这个方法是否能解决你的问题,因为我在自己的电脑上无法重现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接