无法在Python中加载以前转储的大尺寸pickle文件

use*_*719 9 python numpy pickle networkx

我使用cPickle和协议版本2来转储一些计算结果.代码如下所示:

> f = open('foo.pck', 'w')
> cPickle.dump(var, f, protocol=2)
> f.close()
Run Code Online (Sandbox Code Playgroud)

变量var是长度为2的元组.var [0]的类型是一个列表,var [1]是一个numpy.ndarray.

上面的代码段成功生成了一个大尺寸(~1.7G)的文件.

但是,当我尝试从foo.pck加载变量时,我收到以下错误.

ValueError                                Traceback (most recent call last)
/home/user_account/tmp/<ipython-input-3-fd3ecce18dcd> in <module>()
----> 1 v = cPickle.load(f)
ValueError: buffer size does not match array size
Run Code Online (Sandbox Code Playgroud)

加载代码如下所示.

> f= open('foo.pck', 'r')
> v = cPickle.load(f)
Run Code Online (Sandbox Code Playgroud)

我也尝试使用pickle(而不是cPickle)来加载变量,但是得到了类似的错误消息,如下所示.

ValueError                                Traceback (most recent call last)
/home/user_account/tmp/<ipython-input-3-aa6586c8e4bf> in <module>()
----> 1 v = pickle.load(f)

/usr/lib64/python2.6/pickle.pyc in load(file)
   1368 
   1369 def load(file):
-> 1370     return Unpickler(file).load()
   1371 
   1372 def loads(str):

/usr/lib64/python2.6/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/usr/lib64/python2.6/pickle.pyc in load_build(self)
   1215         setstate = getattr(inst, "__setstate__", None)
   1216         if setstate:
-> 1217             setstate(state)
   1218             return
   1219         slotstate = None

ValueError: buffer size does not match array size
Run Code Online (Sandbox Code Playgroud)

我尝试了相同的代码段到更小的数据,它工作正常.所以我最好的猜测是我达到了pickle(或cPickle)的加载大小限制.但是,成功转储(使用大型变量)但无法加载是很奇怪的.

如果这确实是一个加载大小限制问题,我应该如何绕过它?如果没有,问题的可能原因是什么?

任何建议表示赞赏.谢谢!

HYR*_*YRY 3

numpy.save()通过&保存和加载 numpy 数组怎么样np.load()

您可以将 pickled 列表和 numpy 数组保存到同一个文件中:

import numpy as np
import cPickle
data = np.random.rand(50000000)
f = open('foo.pck', 'wb')
cPickle.dump([1,2,3], f, protocol=2)
np.save(f, data)
f.close()
Run Code Online (Sandbox Code Playgroud)

读取数据:

import cPickle
import numpy as np
f= open('foo.pck', 'rb')
v = cPickle.load(f)
data = np.load(f)
print data.shape, data
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下为什么这有效吗?我正在使用另一个库(pandas),它在大 pkl 文件的情况下失败。 (3认同)