什么是Python的良好的磁盘“set”实现?

时间:2011-05-19 10:27:00

标签: python data-structures set

我正在开发一个Python程序,需要存储一个包含许多固定大小哈希值的持久“set”数据结构(SHA256,但这并不重要)。关键操作是插入查找。常规操作不需要删除。该集将随着时间的推移而增长,最终可能并非全部适合记忆。

我考虑过:

  • 使用set存储在磁盘上的pickle(缓慢[几秒钟]将新文件写入磁盘,最终无法存储在内存中)
  • SQLite数据库(默认情况下不提供其他依赖项)
  • 基于磁盘的自定义平衡树结构,例如B树或类似的

理想情况下,会有一个内置的Python模块,它提供了可以支持这些操作的东西。这里有什么好的选择?

在我写完这篇文章后,我发现Fast disk-based hashtables?有一些好主意。我喜欢mmap / bucket接受的答案。

(如果您感到好奇,这是为了重写shaback。)

4 个答案:

答案 0 :(得分:4)

另一个选择是使用shelve,我知道它与pickle(引擎盖下)相同,但我认为这是一个很好的选择(我没有在你的选项列表中看到:-))或也许如果你不介意使用第三方库,你可以看看shove(它就像一个搁置++)。

答案 1 :(得分:0)

我认为这就像sqlite这样的数据库。有没有理由你不能使用它?

答案 2 :(得分:0)

您可以使用DBM样式数据库。我正在用dbm做类似的事情,只是存储值为'1'的所有键。由于它是BSD,dbhash模块应该可以工作。 (它已被弃用,因此没有Python 3;因此不适合长期使用)。否则,使用模块gdbm(Python 3中的dbm.gdbm)和ndbm(Python 3中的dbm.dbm)。还有模块dumbdbm(Python 3中的dbm.dumbdbm),它是纯python并且始终有效,但速度稍慢。此外,如果您要同时进行多个读写操作,请务必不要使用dumbdbm模块。

各种dbm模块都像python字典一样工作,除了键和值需要是字符串。您可以使用“in”关键字,就像使用set或dict一样。

答案 3 :(得分:0)

Dbm并将第二个值设置为任意值1,正如Brian Minton建议的那样是一个方便的解决方案。 cPickle也很好

但是,你也应该考虑使用json。检查谷歌但AFAIK,似乎json解析器比Pickle / cPickle更快。 (例如,http://kovshenin.com/2010/pickle-vs-json-which-is-faster/