我正在开发一个Python程序,需要存储一个包含许多固定大小哈希值的持久“set”数据结构(SHA256,但这并不重要)。关键操作是插入和查找。常规操作不需要删除。该集将随着时间的推移而增长,最终可能并非全部适合记忆。
我考虑过:
set
存储在磁盘上的pickle
(缓慢[几秒钟]将新文件写入磁盘,最终无法存储在内存中)理想情况下,会有一个内置的Python模块,它提供了可以支持这些操作的东西。这里有什么好的选择?
在我写完这篇文章后,我发现Fast disk-based hashtables?有一些好主意。我喜欢mmap / bucket接受的答案。
(如果您感到好奇,这是为了重写shaback。)
答案 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/)