Python中的持久引用

时间:2012-04-05 13:46:34

标签: python persistence pickle

我希望我的程序存储数据供以后使用。到目前为止,没有任何问题:在Python中有很多方法可以做到这一点。

事情变得有点复杂,因为我想在实例之间保留引用。如果列表X是列表Y(它们具有相同的ID,修改一个是修改另一个),则下次加载数据时应该为true(同时停止的程序的另一个会话)。

我知道一个解决方案:pickle模块保留了引用的轨迹,并且会记住我的X和Y列表完全相同(不仅是它们的内容,还有它们的引用)。

然而,使用pickle的问题是,如果您将每个数据转储到单个文件中,它就可以正常工作。如果你有大量的数据,哪个不是很聪明。

你知道另一种处理这个问题的方法吗?

3 个答案:

答案 0 :(得分:2)

最简单的事情可能就是将你希望保存的所有状态包含在字典中(可能由变量名称键入,或者其他一些唯一但可预测的标识符),然后对该字典进行pickle和unpickle。字典中的对象将按照您的意愿在彼此之间共享引用:

>>> 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

答案 1 :(得分:1)

我建议使用shelve而不是泡菜。它具有更高级别的功能,并且使用起来更简单。

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

如果因操作非常大量的数据而出现性能问题,可以尝试其他类似pyTables的库:

http://www.pytables.org/moin

答案 2 :(得分:0)

开发ZODB是为了保存持久的python对象和所有引用。只需从Persistent继承您的课程并享受乐趣。 http://www.zodb.org/