用dill序列化swig扩展

sqougxex  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(254)

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

有没有办法让它正常工作?

wztqucjr

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

相关问题