2

我有很多对象通过保留对其他对象的引用来形成网络。所有对象(节点)都有一个字典,这是它们的属性。

现在我正在寻找一种快速的方法来存储这些对象(在文件中?)并稍后将它们全部重新加载到内存中(我不需要随机访问)。数据在内存中大约 300MB,从我的 SQL 格式加载需要 40 秒,但我现在想缓存它以便更快地访问。

你会建议哪种方法?

(尽管我试图弄乱getstate ,但由于递归错误,我的泡菜尝试失败了:(也许有什么快的东西?:))

4

3 回答 3

0

也许您可以设置一些间接层,其中对象实际上保存在另一个字典中,并且引用另一个对象的对象将存储被引用对象的键,然后通过字典访问该对象。如果存储键的对象不在字典中,它将从您的 SQL 数据库加载到字典中,并且当它似乎不再需要时,可以从字典/内存中删除该对象(可能与在删除内存中的版本之前对其在数据库中的状态进行更新)。

这样您就不必一次从数据库中加载所有数据,并且可以将许多对象缓存在内存中以便更快地访问这些对象。不利的一面是每次访问主字典所需的额外开销。

于 2011-05-25T20:45:24.823 回答
0

泡菜是我的第一选择。但是既然你说它不起作用,你可能想尝试shelve,甚至认为这不是 shelve 的主要目的。

真的,你应该为此使用 Pickle。也许您可以发布一些代码,以便我们查看并找出它不起作用的原因

于 2011-05-25T17:39:02.220 回答
0

“pickle 模块会跟踪它已经序列化的对象,这样以后对同一对象的引用就不会再次被序列化。” 所以这是可能的。也许增加递归限制sys.setrecursionlimit

使用 Python 的 Pickle / cPickle 达到最大递归深度

于 2011-05-25T17:39:27.553 回答