我有很多通过保持对其他对象的引用而形成网络的对象。所有对象(节点)都有一个dict,它是它们的属性。
现在我正在寻找一种快速存储这些对象的方法(在文件中?),然后将所有这些对象重新加载到内存中(我不需要随机访问)。内存大约300MB,从我的SQL格式加载需要40s,但我现在想要将其缓存以便更快地访问。
您建议使用哪种方法?
(我的腌菜尝试因递归错误而失败,尽管试图搞乱 getstate :(也许还有什么东西快?)
答案 0 :(得分:0)
Pickle将是我的第一选择。但既然你说它不起作用,你可能想尝试shelve,甚至认为这不是搁置的主要目的。
真的,你应该使用Pickle。也许你可以发布一些代码,以便我们可以看一看并找出它不起作用的原因
答案 1 :(得分:0)
“pickle模块跟踪它已经序列化的对象,以便以后对同一对象的引用不会再次序列化。”所以它是可能的。也许用sys.setrecursionlimit
增加递归限制。
Hitting Maximum Recursion Depth Using Python's Pickle / cPickle
答案 2 :(得分:0)
也许您可以设置一些间接层,其中对象实际上保存在另一个字典中,而引用另一个对象的对象将存储被引用对象的键,然后通过字典访问该对象。如果存储键的对象不在字典中,它将从SQL数据库加载到字典中,当它似乎不再需要时,可以从字典/内存中删除该对象(可能与在删除内存中的版本之前更新其在数据库中的状态。)
这样您就不必一次加载数据库中的所有数据,并且可以将许多对象缓存在内存中,以便更快地访问这些数据。缺点是每次访问主要字典所需的额外开销。