我正在构建一个分发给其他学者的应用程序。应用程序将采用用户提交的三个参数,并输出与这些事件相关的日期和代码列表。我一直在使用字典构建它,并打算构建应用程序,以便在应用程序调用它时从pickle文件加载字典。用户提供的参数将用于查找所需的输出。
我之所以选择这种结构,是因为我对字典和泡菜文件感到非常满意,而且我认为这是我学习曲线最小的问题。字典中可能有多达两百万个键。我对我的机器上有一个合理的子集的性能感到满意。我已经考虑过如何在将整个事情放在一起时遇到任何性能问题时如何打破字典。当我们使用TB级存储值时,我并不担心机器上的磁盘空间量。
说完所有这些我一直在讨论文档,我想知道是否需要投入一些时间来学习和实现替代数据存储文件。我能想到的唯一原因是,是否存在可以将查找速度提高三到五倍或更多的替代方案。
答案 0 :(得分:6)
标准shelve
模块将为您提供存储在dbm样式数据库中的持久字典。假设你的键是字符串而你的值是可选择的(因为你已经使用了pickle,这一定是真的),这可能是一个更好的解决方案,只需将整个字典存储在一个pickle中。
示例:
>>> import shelve
>>> d = shelve.open('mydb')
>>> d['key1'] = 12345
>>> d['key2'] = value2
>>> print d['key1']
12345
>>> d.close()
我还建议Durus,但这需要您进行一些额外的学习。它可以让你创建一个PersistentDictionary。从内存中,键可以是任何可选择的对象。
答案 1 :(得分:2)
要获得快速查找,请使用标准Python dbm
模块(请参阅http://docs.python.org/library/dbm.html)来构建数据库文件,并在其中进行查找。 dbm文件格式可能不是跨平台的,因此您可能希望以Pickle或repr或JSON或YAML或XML格式分发数据,并构建用户运行程序的dbm
数据库。
答案 2 :(得分:2)
您的应用程序可以合理使用多少内存?这是在每个用户的桌面上运行,还是只在某个地方进行部署?
内存中的python字典当然可以处理200万个密钥。你说你有一部分数据;你有很多吗?也许你应该抛出完整的数据集,看看它是否应对。
我刚刚测试了创建一个200万条记录字典;该进程的总内存使用量约为200MB。如果速度是你最关心的问题,并且你有足够的RAM,你可能不会比内存中的python字典做得更好。
答案 3 :(得分:1)
在SourceForge上查看此解决方案,尤其是“尾注”文件:
y_serial.py module ::使用SQLite的仓库Python对象
“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“
答案 4 :(得分:0)
您可以尝试以下三种方法: