Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python gzip引发的溢出错误:大小不适合无符号整数_Python_Gzip_Zlib - Fatal编程技术网

Python gzip引发的溢出错误:大小不适合无符号整数

Python gzip引发的溢出错误:大小不适合无符号整数,python,gzip,zlib,Python,Gzip,Zlib,环境: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.compr

环境: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构建的。在谷歌搜索了这个问题之后,我看到了这个页面。似乎施加了无符号int类型的长度限制


所以,我的问题是,有什么方法可以弥补这个bug或绕过它吗?

您可以尝试将gzip文件包装在一个writer中,将数据拆分为给定最大大小的块。这是一张草图:

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]))

我不确定这是否真的能解决您的问题,因为我无法在自己的计算机上复制它。

除了执行流式压缩之外?数据有多大?架构上的无符号int的大小是多少?看看Python中的C代码,这是一个相当糟糕、有点懒惰的响应。代码应该将输入的UINT_MAX部分输入,直到全部消耗。@MarkAdler:数据大小大约为5.1GB。我猜,您机器上的int的大小是32位。实际上,您的问题是由Python库代码中的一个bug引起的。正如奥古斯拉所描述的,你必须解决这个问题。但是,您可以使用更大的块大小。事实上,在这种特定情况下,您只需要两个块。