0

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

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

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

不过,使用 pickle 的问题在于,如果您将所有数据转储到单个文件中,它就可以工作。如果您有大量数据,这并不是很聪明。

你知道解决这个问题的另一种方法吗?

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

我建议使用shelveover pickle。它具有更高级别的功能,并且更易于使用。

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