Python中无法加载先前转储的pickle文件

3
我使用的实现算法非常复杂,分为三个部分。因此,我使用pickle在各个阶段之间转储所有内容,以便对每个阶段进行单独测试。
虽然第一个转储总是正常工作的,但第二个转储表现出大小依赖性。它适用于较小的数据集,但不适用于稍大的数据集。(我尝试创建的热力图也是同样的问题)转储文件约为10MB,所以并不是很大。
导致问题的转储包含整个类,该类又包含方法、字典、列表和变量。
我实际上尝试了从类内部和外部进行转储,但两者都失败了。 我使用的代码如下:
data = pickle.load(open("./data/tmp/data.pck", 'rb')) #Reads from the previous stage dump and works fine.
dataEvol = data.evol_detect(prevTimeslots, xLablNum) #Export the class to dataEvol
dataEvolPck = open("./data/tmp/dataEvol.pck", "wb") #open works fine
pickle.dump(dataEvol, dataEvolPck, protocol = 2) #dump works fine
dataEvolPck.close()

甚至尝试过这个:

dataPck = open("./data/tmp/dataFull.pck", "wb")
pickle.dump(self, dataPck, protocol=2) #self here is the dataEvol in the previous part of code
dataPck.close()

当我尝试使用以下部分加载类时,出现了问题:

dataEvol = pickle.load(open("./data/tmp/dataEvol.pck", 'rb'))

手头的错误是:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
dataEvol = pickle.load(open("./data/tmp/dataEvol.pck", 'rb'))
ValueError: itemsize cannot be zero

有什么想法吗? 我正在使用64位Win-7计算机上的Python 3.3。如果我漏掉了任何必要的内容,请原谅,因为这是我的第一个问题。


答案:

问题在于字典中一个空的numpy字符串。感谢Janne!!!


你的数据结构中是否有numpy字符串?关于空字符串,这里有一个未解决的bug报告:https://github.com/numpy/numpy/issues/3926 - Janne Karila
谢谢您的回复,Janne。我在numpy中没有使用字符串。奇怪的是,它在同一数据集的子集上运行良好。可能是因为它无法保存大字典,因此尝试加载损坏的文件吗? - dinos66
如果你排除掉正常运行的子集,剩下的数据集还存在问题吗?试着通过这种方式来缩小范围。 - Janne Karila
一个空字典键可能会做到这一点吗?我从一个字典中删除了一些变量(它们绝对不是空的;通过pyscripter进行了检查),以及这个字典中的一个空键,现在一切都正常了。哦,它从未包含任何numpy数组,尽管我用它们来创建一个类的字典。我的错。如果我有点误导了,我很抱歉。 - dinos66
你说得完全正确,Janne。这是一个从np.append中传递过来的numpy.string_,我完全忘记了。该死,非常抱歉浪费了你的时间。我应该首先检查它!万分感谢! - dinos66
显示剩余4条评论
1个回答

1
这是一个与NumPy相关的错误,最近在 pull request中已修复。要重现此错误,请尝试:
import cPickle
import numpy as np
cPickle.loads(cPickle.dumps(np.string_('')))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接