gpt4 book ai didi

python - 用 dill 序列化 SWIG 扩展

转载 作者:可可西里 更新时间:2023-11-01 15:05:16 24 4
gpt4 key购买 nike

最近,有人要求我“让我们的 C++ 库在云端运行”。基本上,lib 是计算 secret 集型的(计算价格),所以它是有道理的。我构建了一个 SWIG 接口(interface)来制作一个 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

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

最佳答案

我是 dill 的作者。没错,dill 不能 pickle C++ 对象。当您看到 it's not found as builtin.some_object… 这几乎总是意味着您正在尝试 pickle 一些不是用 python 编写的对象 ,但使用 python 绑定(bind)到 C/C++(即扩展类型)。您没有希望使用 python 序列化程序直接 pickle 此类对象。

但是,由于您对 pickle 扩展类型的子类感兴趣,所以您实际上可以这样做。您需要做的就是为您的对象提供您想要保存为一个或多个实例属性的适当状态,并提供一个 __reduce__ 方法来告诉 dill(或 pickle) 如何保存对象的状态。此方法是 python 处理序列化扩展类型的方式。看: https://docs.python.org/2/library/pickle.html#pickling-and-unpickling-extension-types

可能有更好的例子,但这里至少有一个例子: https://stackoverflow.com/a/19874769/4646678

关于python - 用 dill 序列化 SWIG 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32295313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com