我正在使用多处理模块在 Python 中进行大量并行处理。我知道某些对象可以是 pickle (因此作为 multi-p 中的参数传递),而其他对象则不能。例如。
class abc():
pass
a=abc()
pickle.dumps(a)
'ccopy_reg\n_reconstructor\np1\n(c__main__\nabc\np2\nc__builtin__\nobject\np3\nNtRp4\n.'
但我的代码中有一些较大的类(十几个方法,左右),并且发生这种情况:
a=myBigClass()
pickle.dumps(a)
Traceback (innermost last):
File "<stdin>", line 1, in <module>
File "/usr/apps/Python279/python-2.7.9-rhel5-x86_64/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle file objects
它不是文件对象,但在其他时候,我会收到其他消息,基本上是:“我无法腌制这个”。
那么规则是什么呢?字节数?层次结构的深度?月相?
I'm the dill
作者。有一个相当全面的清单,列出了哪些泡菜和哪些不泡菜dill
。它可以在每个 Python 2.5-3.4 版本上运行,并根据 pickles 进行调整dill
或者用什么泡菜pickle
通过改变一个标志。看here https://github.com/uqfoundation/dill/blob/master/tests/test_objects.py and here https://github.com/uqfoundation/dill/blob/master/dill/_objects.py.
泡菜规则的根源(在我的脑海中):
- 您能否通过引用捕获对象的状态(即
函数定义在
__main__
与导入的函数相比)? [好的]
- 是否有通用的
__getstate__
and __setstate__
给定对象类型是否存在规则? [好的]
- 它是否取决于
Frame
对象(即依赖 GIL 和全局执行堆栈)?迭代器现在是一个例外,通过在 unpickle 时“重放”迭代器。 [Then, no]
- 对象实例是否指向错误的类路径(即由于在闭包、C 绑定或其他中定义)
__init__
路径操作)? [Then, no]
- Python 认为允许这样做是危险的吗? [Then, no]
因此,(5)现在不像以前那么流行了,但在语言中仍然有一些持久的影响pickle
. dill
在大多数情况下,删除了 (1)、(2) 和 (5),但仍然受到 (3) 和 (4) 的相当影响。
我可能忘记了其他事情,但我认为总的来说这些是基本规则。
某些模块如multiprocessing
注册一些对其功能很重要的对象。dill
注册该语言中的大多数对象。
The dill
的叉子multiprocessing
是必需的,因为multiprocessing
uses cPickle
, and dill
只能扩充纯Python pickling 注册表。如果您有耐心,您可以完成所有相关的copy_reg
功能于dill
,并将它们应用到cPickle
模块,你会得到一个更具有pickle能力的multiprocessing
。我找到了一种简单的(读:单行)方法来做到这一点pickle
, 但不是cPickle
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)