python - 无法在 Python 中加载以前转储的大型 pickle 文件

标签 python numpy networkx pickle

我使用 cPickle 和协议(protocol)版本 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)的加载大小限制。但是,转储成功(大尺寸变量)却加载失败就奇怪了。

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

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

最佳答案

如何通过 numpy.save()np.load() 保存和加载 numpy 数组?

您可以将 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()

读取数据:

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

关于python - 无法在 Python 中加载以前转储的大型 pickle 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12060932/

相关文章:

python - Numpy---如何同时替换数组中的某些多个元素?

python - 是否可以在 Networkx 图中混合不同形状的节点?

python - Tensorflow 对象检测培训最佳实践问题

python - Python 中的条件 except 语句

python - 使用 3d 数组的索引来填充 4d 数组

python - 按元素除法,忽略零

python - 从邻接矩阵中绘制具有边权重的特定网络

python - 进一步编辑 PyVis 工具提示中的项目?

python - 使用 RegEx 解析不同的数字

Python打开和读取文件一类