0

後で使用するためにプログラムにデータを保存したいと思います。今のところ、問題はありません。Python でこれを行う方法はたくさんあります。

インスタンス間の参照を保持したいので、状況はもう少し複雑になります。リスト X がリスト Y (同じ ID を持ち、一方を変更すると他方が変更される) である場合、次にデータをロードするときは true になるはずです (その間に停止したプログラムの別のセッション)。

私は解決策を知っています: pickle モジュールは参照を追跡し、私の X リストと Y リストがまったく同じであることを記憶します (それらの内容だけでなく、それらの参照も)。

それでも、pickle を使用する際の問題は、すべてのデータを 1 つのファイルにダンプする場合に機能することです。大量のデータがある場合、これはあまり賢明ではありません。

この問題を処理する別の方法を知っていますか?

4

3 に答える 3

2

最も簡単な方法は、保存したいすべての状態をディクショナリ (変数名、またはその他の一意だが予測可能な識別子でキー付け) にラップし、そのディクショナリをピクルおよびアンピクルすることです。ディクショナリ内のオブジェクトは、必要に応じて相互に参照を共有します。

>>> class X(object):
...     # just some object to be pickled
...     pass
... 
>>> l1 = [X(), X(), X()]
>>> l2 = [l1[0], X(), l1[2]]
>>> state = {'l1': l1, 'l2': l2}
>>> saved = pickle.dumps(state)
>>> restored = pickle.loads(saved)
>>> restored['l1'][0] is restored['l2'][0]
True
>>> restored['l1'][1] is restored['l2'][1]
False
于 2012-04-05T13:58:00.347 に答える
1

shelveピクルスを使うことをお勧めします。それはより高いレベルの機能性を持ち、そして使用するのがより簡単です。

http://docs.python.org/library/shelve.html

非常に大量のデータを操作するためにパフォーマンスの問題が発生した場合は、pyTablesなどの他のライブラリを試すことができます。

http://www.pytables.org/moin

于 2012-04-05T15:24:16.657 に答える
0

ZODB は、永続的な Python オブジェクトとすべての参照を保存するために開発されました。Persistent からクラスを継承して楽しんでください。http://www.zodb.org/

于 2012-04-05T13:55:59.223 に答える