2015-11-06 120 views
3

環境:Windows,Python 3.4.1,64位版本。gzip引發溢出錯誤:大小不符合unsigned int

我試圖將數據與泡菜和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。似乎有一個unsigned int類型的長度限制是強加的。

所以,我的問題是,有什麼辦法彌補這個錯誤或傳遞它?

+0

除了執行流式壓縮? –

+0

數據有多大以及架構上無符號整數的大小是多少? –

+0

在Python中查看C代碼,這是一個相當差,有點懶惰的反應。代碼應該反饋給輸入的UINT_MAX部分,直到它被全部使用。 –

回答

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

我不知道這是否會真正解決你的問題,因爲我無法重現它在我自己的電腦上。