什么是磁盘上的好文件;“设置”;Python的实现?

什么是磁盘上的好文件;“设置”;Python的实现?,python,data-structures,set,Python,Data Structures,Set,我正在用Python编写一个程序,该程序需要存储一个持久的“set”数据结构,其中包含许多固定大小的散列值(SHA256,但这并不重要)。关键操作是插入和查找。常规操作不需要删除。随着时间的推移,集合会不断增长,最终可能无法全部放入内存中 我曾考虑: 使用pickle将set存储在磁盘上(将新文件写入磁盘的速度慢[几秒钟],最终无法放入内存) SQLite数据库(默认情况下,其他依赖项不可用) 自定义基于磁盘的平衡树结构,如B树或类似结构 理想情况下,应该有一个内置的Python模块来提供支

我正在用Python编写一个程序,该程序需要存储一个持久的“set”数据结构,其中包含许多固定大小的散列值(SHA256,但这并不重要)。关键操作是插入和查找。常规操作不需要删除。随着时间的推移,集合会不断增长,最终可能无法全部放入内存中

我曾考虑:

  • 使用
    pickle
    set
    存储在磁盘上(将新文件写入磁盘的速度慢[几秒钟],最终无法放入内存)
  • SQLite数据库(默认情况下,其他依赖项不可用)
  • 自定义基于磁盘的平衡树结构,如B树或类似结构
理想情况下,应该有一个内置的Python模块来提供支持这些操作的东西。这里有什么好的选择

在我写了这篇文章之后,我发现它有一些好的想法。我喜欢那里的mmap/桶接受答案


(如果你好奇的话,这是为了重写。)

另一个选择是使用,我知道它和pickle(在引擎盖下)一样,但我认为这是一个不错的选择(我在你的选项列表中没有看到:-),或者如果你不介意使用第三方库,你可以看看(它就像一个搁置++).

我认为这就是像sqlite这样的数据库的用途。您不能使用它有什么原因吗?

您可以使用DBM样式的数据库。我对dbm也做了类似的事情,只存储所有值为“1”的键。因为它是BSD,所以dbhash模块应该可以工作。(它已被弃用,因此没有Python3;因此长期使用也不是一个好主意)。否则,请使用模块gdbm(python3中的dbm.gdbm)和ndbm(python3中的dbm.dbm)。还有一个模块dumbdbm(Python3中的dbm.dumbdbm),它是纯Python的,总是可以工作,但速度稍慢。此外,如果要同时进行多个读写操作,则绝对不要使用dumbdbm模块


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

Dbm,按照Brian Minton的建议,将第二个值设置为任意值1是一个方便的解决方案。cPickle也不错


但是,您也应该考虑使用JSON。检查一下google,但是很明显,json解析器似乎比Pickle/cPickle更快。(例如)

事实上,mmap/bucket实现正是我想要的。如果没有更好的主意,我将把它编码并发布在这里。出于兴趣,您最终需要存储多少值的数量级是多少?@aix:这是一个备份程序,每个文件一个散列。文件系统上有多少个文件?:)这看起来是个不错的选择,它如何根据可用的内容选择合适的后端非常好。默认情况下,SQLite在Python安装中并不总是可用的。@Greg:它在Python 2.5及更高版本中;这是不够的吗?@katriealex:这有点像,因为Python部分是默认安装的。但至少在FreeBSD上,安装
。因此
需要额外的步骤。