1

オブジェクト グラフのシリアル化をモジュール方式で実行したいと考えています。つまり、グラフ全体をシリアル化したくありません。その理由は、このグラフが大きいからです。グラフの一部のタイムスタンプ付きバージョンを保持できます。また、遅延アクセスを実行して、現在必要のない部分の読み込みを延期できます。

Pythonのメタプログラミングでこれを管理できると思いました。しかし、Python ではメタプログラミングが十分に強力ではないようです。

これが今のところ私がしていることです。私のグラフは、いくつかの異なるオブジェクトで構成されています。それらのいくつかは、特別なクラスのインスタンスです。このクラスは、ピクルされるルート オブジェクトを記述します。これがモジュール性の出番です。何かをピクルするたびに、それらのインスタンスの1つから始まり、同時に2つをピクルすることはありません。ルート オブジェクトからアクセスできる別のインスタンスへの参照がある場合は常に、この参照を persistant_id に置き換えます。これにより、同じピクル ストリームにそれらが 2 つ含まれないようにします。問題は、ストリームを unpickle するときに発生します。まだロードされていないインスタンスの persistant_id を見つけることができます。この場合、アクセスを許可する前に、ターゲット インスタンスがロードされるのを待つ必要があります。とにかくそれを行う方法がわかりません:

1/ getメソッドが参照のターゲットを返すアクセサを構築しようとしました。残念ながら、アクセサーはクラス宣言に配置する必要があります。それらを unpickled オブジェクトに割り当てることはできません。2/参照を解決する必要がある場所をどこかに保存できます。これは Python では可能ではないと思います: 場所 (フィールドまたは変数) への参照を保持することはできず、値への参照のみを保持することができます。

私の問題は明確ではないかもしれません。私はまだ明確な処方を探しています。「参照」クラスのインスタンスとなる明示的な参照を使用するなど、他のことを試しました。あまり便利ではありませんが。

pickle でモジュラーシリアライゼーションを実装する方法を知っていますか? オブジェクトグラフの残りをロードする必要がある場所を記憶できるように、Unpickler の内部動作を変更する必要がありますか? 同様の結果を達成するのに適した別のライブラリはありますか?

4

2 に答える 2

0

Python ではメタプログラミング強力です。Python クラスは非常に順応性があります。メタクラス (デコレータ) で行うのが最適ですが、宣言後に好きなように変更できます。それ以上に、インスタンスはそのクラスとは無関係に順応性があります。

多くの場合、「場所への参照」は単なる文字列です。たとえば、オブジェクトのフィールドへの参照はその名前です。ノード オブジェクト内に複数のノード参照があるとします。{persistent_id: (object, field_name),..}未解決の参照テーブルのようなものを簡単に検索できます。同様に、ノードのリストでは、「場所への参照」はインデックスです。

ところで、グラフの保存にキー値データベースを使用できますか? 待たずに ID でノードをプルできます。

于 2012-05-15T21:14:51.553 に答える
0

これが私がこれについて行くと思う方法です。

  1. モジュール レベルのディクショナリを使用して、persistent_id を SpecialClass オブジェクトにマッピングします。インスタンスを初期化または unpickle するたびにSpecialClass、それがディクショナリに追加されていることを確認してください。

  2. SpecialClass の__getattr__and__setattr__メソッドをオーバーライドspecialobj.foo = anotherspecialobjして、persistent_id を specialobj の辞書に格納するだけです (これを と呼びましょうspecialobj.specialrefs)。を取得するspecialobj.fooと、specialrefs で名前が検索され、モジュール レベルの辞書で参照が検索されます。

  3. check_graph既知のSpecialClassインスタンスを調べて、それらのすべての specialrefs が利用可能であることを確認するモジュール レベルの関数を用意します。

于 2012-05-15T20:56:14.923 に答える