使用dill序列化SWIG扩展

时间:2015-08-30 10:00:11

标签: python c++ hadoop serialization dill

最近,我被要求让我们的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

有没有办法让这项工作正常进行?

1 个答案:

答案 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