【问题标题】:Memory efficient way of checking inclusion检查包含的内存有效方法
【发布时间】:2012-10-28 23:59:05
【问题描述】:

如果不是因为我需要存储比我的 4 GB RAM 容量更多的数据,我可以使用 dict 来完成这项任务。我还在同一个程序中做其他需要内存的事情,所以内存要求越低越好。

我只是想

  1. 存储许多个字符串

  2. 检查集合中是否包含字符串

有没有一种 Python 方法可以做到这一点?我使用的是 3.3,所以 berkelydbs 已经出局了。

它还需要给出准确的答案,所以没有 Bloom-filters。

【问题讨论】:

  • 感谢编辑以获得更好的标题。我画了一个空白。
  • 我想知道同一程序中的其他内存需求是什么,可能数据库也适合
  • 您是否需要将原始字符串保留在内存中,或者您是否可以将“许多字符串”的哈希值存储在一组中并进行检查?

标签: python large-data


【解决方案1】:

如果数据不适合您的内存,那么您将别无选择,您将不得不将部分数据临时存储在外部存储设备(您的磁盘)中。正如您猜对的那样,文件访问既昂贵又缓慢,因此要尽量减少磁盘操作。

由于您似乎需要键值存储(因为您有一个 dict),因此最好将其拆分,以便相关数据位于类似的位置,然后您可以快速逐块读入内存进行计算。

但如何做到这一点完全取决于您实际在做什么,如果没有更多信息,我们无法真正为您提供帮助。

顺便说一句。正如您提到的 Berkeley DB,实际上有用于 Python 3.2 的 bindings,如果他们也在 Python 3.3 上工作,我不会感到惊讶。否则 3.3 仍然相当新,因此可能会更新。如果您正在寻找替代的键值存储数据库,不妨试试redis。不过我还没试过Python bindings

【讨论】:

    【解决方案2】:

    使用sqlite3,它完全符合您的需求

    如果您绝对需要快速查找,您可以使用 marisa 树,请参阅http://kmike.ru/python-data-structures/,但首先您必须确认它是您应用程序中的瓶颈。尤其是缓存可以用磁盘数据库做奇妙的事情。不要过早优化。个人资料。

    【讨论】:

      【解决方案3】:

      好吧,如果你只是需要存储它,为什么要把它保存在内存中,使用某种数据库。

      【讨论】:

      • 但是检查包容性不是很贵吗?我将需要多次荒谬地进行这些查找。而且程序运行后,我根本不需要存储数据。
      【解决方案4】:

      只需使用标准的shelve 模块来创建持久字典。

      【讨论】:

      • @TheUnfunCat:实际上听起来你需要的是一个持久的set。字典可以很容易地用于实现一个集合类,例如here 所示。我认为使用Shelf 代替dict 可以应用几乎完全相同的方法。
      • @TheUnfunCat:实现持久set 类的更优雅和现代的方法是从ABC collections.Set 派生一个。
      猜你喜欢
      • 1970-01-01
      • 2013-05-28
      • 2020-01-19
      • 2016-10-19
      • 2020-10-31
      • 2021-07-16
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多