【问题标题】:Unable to load a previously dumped pickle file in Python无法在 Python 中加载以前转储的泡菜文件
【发布时间】:2014-01-26 17:44:59
【问题描述】:

我使用的实现算法非常繁重,分为三个部分。因此,我使用 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 字符串。谢谢珍妮!!!

【问题讨论】:

  • 你的数据结构中有 numpy 字符串吗?有一个关于空的错误报告:github.com/numpy/numpy/issues/3926
  • 感谢您回复 Janne。我不使用 numpy 的字符串。奇怪的是,它适用于同一数据集的子集。难道是它无法保存一个大字典,因此它试图加载一个损坏的文件?
  • 如果您消除了工作正常的子集,您是否对数据集的其余部分有问题?尝试以这种方式缩小范围。
  • 字典中的空键可以做到这一点吗?我从这本字典中删除了一些变量(绝对不是空的;通过 pyscripter 检查)和这个空键,现在一切似乎都很好。哦,它从不包含任何 numpy 数组,尽管我确实使用它们来创建一个字典,它是类的一部分。我的错。如果我有点误导,我很抱歉。
  • 空键是什么类型的?使用type(key)查看。

标签: python numpy pickle


【解决方案1】:

这是最近在此pull request 中修复的 NumPy 错误。要重现它,请尝试:

import cPickle
import numpy as np
cPickle.loads(cPickle.dumps(np.string_('')))

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多