我使用 cPickle 和协议版本 2 来转储一些计算结果。代码如下所示:
> f = open('foo.pck', 'w')
> cPickle.dump(var, f, protocol=2)
> f.close()
变量 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
加载代码如下所示。
> f= open('foo.pck', 'r')
> v = cPickle.load(f)
我还尝试使用 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
我尝试将相同的代码段用于更小的数据,并且效果很好。所以我最好的猜测是我达到了pickle(或cPickle)的加载大小限制。但是,成功转储(具有大尺寸变量)但无法加载是很奇怪的。
如果这确实是加载大小限制问题,我应该如何绕过它?如果不是,问题的可能原因是什么?
任何建议表示赞赏。谢谢!