Python pickle.dump()无法保存复杂对象,但未引发异常

Python pickle.dump()无法保存复杂对象,但未引发异常,python,object,pickle,Python,Object,Pickle,我正在尝试使用pickle保存一个非常复杂的对象。对象的结构被省略,因为它非常复杂,但它不需要太多内存(~5MB) nX=20 纽约=50 模型=复杂网格模型(nX,nY)#nX,nY数量或X,Y方向上的元素 #我认为这并不重要,但“模型”的使用方式如下: analyzer=OtherComplexObject(*args,**kwargs) analyzer.model=模型 开始=时间() […]#模型和分析器上的循环操作 结束=时间() #现在是关键部分 打印(“在{.2f}分钟内完成”。

我正在尝试使用
pickle
保存一个非常复杂的对象。对象的结构被省略,因为它非常复杂,但它不需要太多内存(~5MB)

nX=20
纽约=50
模型=复杂网格模型(nX,nY)#nX,nY数量或X,Y方向上的元素
#我认为这并不重要,但“模型”的使用方式如下:
analyzer=OtherComplexObject(*args,**kwargs)
analyzer.model=模型
开始=时间()
[…]#模型和分析器上的循环操作
结束=时间()
#现在是关键部分
打印(“在{.2f}分钟内完成”。格式(end/60-start/60))#打印运行时间
以open('filename.pickle','wb')作为文件:
pickle.dump(model,file,protocol=pickle.HIGHEST_protocol)#这里是crushes或类似的东西,我不知道
上面的代码创建了文件
filename.pickle
,但它是空的,大小为0 KB。当我注释掉
pickle
部分时,一切都完美无瑕,但我仍然想保存
model
。 有三个我无法解释的事实:

  • 一切正常,直到我更改nX>24。因此,如果nX=20,一切正常
  • 无论是在我自己的代码中,还是在
    pickle.dump()
    期间,都不会抛出任何
    错误
    
  • 当错误发生时,即使是previous
    pickle.dump()
    的行,即
    print(…)
    也不会执行,下一行也不会执行。看起来变量也被删除了。我的Spyder编辑器在变量资源管理器中显示它们,但当我试图从控制台访问它们时,它会抛出
    NameError:name'variable\u name'未定义

  • 我知道这是毒品,我肯定会怀疑我的密码有问题;但是没有任何错误,我无能为力。如果我的代码出错,它是否至少会在pickle.dump()之前抛出一个
    错误

    nX
    >24时,
    ComplexObject
    实例有什么不同?它只是使用了更多的内存,例如更大的列表等。为了简化,它是一个二维网格,所以我增加了一维。我原以为pickle可能有内存限制,但读取文档时,它的大小远远大于所需的大小,例如nx=20。这可能只是pickle中的一个bug。您可以通过使用不同的协议来避免它。尝试0到3范围内的值。Py 3.4中添加了协议4以支持非常大的对象(可能是
    最高的_协议
    )。我尝试并使用了0,但只使用了一次。当我再次尝试时,结果还是一样。没有道理,这当然很奇怪。另一种解决方法(假设它是一个bug)可能是向类添加
    \uu getstate\uu()
    \uuu setstate\uu()
    方法,以控制其酸洗。