【问题标题】:Store and load a large number linked objects in Python在 Python 中存储和加载大量链接对象
【发布时间】:2011-09-01 23:25:44
【问题描述】:

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

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

您会建议哪种方法?

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

【问题讨论】:

  • 我唯一的建议是泡菜,但您似乎已经尝试过...

标签: python persistent-storage


【解决方案1】:

泡菜是我的第一选择。但既然你说它不起作用,你可能想试试shelve,即使这不是搁置的主要目的。

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

【讨论】:

  • 没有什么比泡菜更快的了?也许那么使用 recursionlimit 和 getstate 的麻烦是值得的......
【解决方案2】:

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

Hitting Maximum Recursion Depth Using Python's Pickle / cPickle

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2011-02-14
      • 2013-12-08
      相关资源
      最近更新 更多