最近,我被要求让我们的C ++ lib在云中工作"。 基本上,lib是计算机密集型(计算价格),因此它是有意义的。 我已经构建了一个SWIG接口来制作一个python版本,在脑海中使用MapReduce和MRJob。 我想序列化文件中的对象,并使用映射器,反序列化并计算价格。
例如:
class MRTest(MRJob):
def mapper(self,key,value):
obj = dill.loads(value)
yield (key, obj.price())
但是现在我达到了死胡同,因为似乎dill无法处理SWIG扩展:
PicklingError: Can't pickle <class 'SwigPyObject'>: it's not found as builtins.SwigPyObject
有没有办法让这项工作正常进行?
答案 0 :(得分:2)
我是dill
作者。这是正确的,dill
无法腌制C ++对象。当你看到it's not found as builtin.
some_object 时......几乎总是意味着你试图挑选一些不是用python编写的某个对象,而是使用python绑定到C / C ++(即扩展类型)。你没有希望用python序列化器直接腌制这些对象。
但是,由于您有兴趣挑选扩展类型的子类,您实际上可以这样做。您需要做的就是为对象提供要作为实例属性保存的适当状态,并提供__reduce__
方法来告诉dill
(或pickle
)保存对象的状态。这个方法是python处理序列化扩展类型的方法。看到:
https://docs.python.org/2/library/pickle.html#pickling-and-unpickling-extension-types
可能有更好的例子,但这里至少有一个例子: https://stackoverflow.com/a/19874769/4646678