最近,我被要求让“我们的c++库在云中工作”。基本上,lib是计算机密集型的(计算价格),所以它是有意义的。我已经构建了一个swig接口来制作一个python版本,并考虑将mapreduce与mrjob结合使用。我想序列化文件中的对象,并使用Map器反序列化和计算价格。
例如:
class MRTest(MRJob):
def mapper(self,key,value):
obj = dill.loads(value)
yield (key, obj.price())
但现在我到了一个死胡同,因为似乎迪尔不能处理swig扩展:
PicklingError: Can't pickle <class 'SwigPyObject'>: it's not found as builtins.SwigPyObject
有没有办法让它正常工作?
1条答案
按热度按时间wztqucjr1#
我是最棒的
dill
作者。没错,dill
无法pickle c对象。当你看到it's not found as builtin.
某个对象…这几乎总是意味着您试图pickle某个不是用python编写的对象,而是使用python绑定到c/c(即扩展类型)的对象。您不希望用python序列化程序直接处理这些对象。但是,由于您对pickle扩展类型的子类感兴趣,所以实际上可以这样做。您所需要做的就是为对象提供适当的状态,以便将其保存为一个或多个示例属性,并提供
__reduce__
告诉的方法dill
(或pickle
)如何保存对象的状态。这个方法就是python处理序列化扩展类型的方法。请参见:https://docs.python.org/2/library/pickle.html#pickling-和取消勾选扩展类型可能有更好的例子,但这里至少有一个例子:https://stackoverflow.com/a/19874769/4646678