1

最近、「私たちの C++ ライブラリをクラウドで動作させる」よう依頼されました。基本的に、lib はコンピューター集約型 (価格の計算) であるため、理にかなっています。MRJob で MapReduce を使用することを念頭に置いて、Python バージョンを作成するための SWIG インターフェイスを作成しました。ファイル内のオブジェクトをシリアル化し、マッパーを使用して逆シリアル化し、価格を計算したいと考えていました。

例えば:

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

これを適切に機能させる方法はありますか?

4

1 に答える 1

3

私はdill著者です。そうです、dillC++ オブジェクトをピクルできません。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

おそらくもっと良い例がありますが、少なくとも 1 つの例を次に示します: https://stackoverflow.com/a/19874769/4646678

于 2015-08-31T15:48:13.983 に答える