python - 搁置对于大型词典来说太慢了,我该怎么做才能提高性能?

标签 python database performance persistence shelve

我正在使用 python 存储一个表,我需要持久性。

本质上,我将表格存储为数字的字典字符串。并且整体用架子存放

self.DB=shelve.open("%s%sMoleculeLibrary.shelve"%(directory,os.sep),writeback=True) 

我将 writeback 设置为 True,因为我发现如果不这样做,系统会变得不稳定。

计算完成后,系统需要关闭数据库,并将其存储回去。现在数据库(表)大约有 540MB,而且需要很长时间。表增长到大约 500MB 后,时间激增。但我需要一张更大的 table 。事实上,我需要其中两个。

我可能使用了错误的持久性形式。我可以做些什么来提高性能?

最佳答案

为了存储一个包含string : number 键值对的大型字典,我建议使用 JSON 原生存储解决方案,例如 MongoDB .它有一个很棒的 Python API,Pymongo . MongoDB 本身是轻量级的,而且速度非常快,而 json 对象本身就是 Python 中的字典。这意味着您可以使用 string 键作为对象 ID,从而允许压缩存储和快速查找。

作为代码简单程度的示例,请参见以下内容:

d = {'string1' : 1, 'string2' : 2, 'string3' : 3}
from pymongo import Connection
conn = Connection()
db = conn['example-database']
collection = db['example-collection']
for string, num in d.items():
    collection.save({'_id' : string, 'value' : num})
# testing
newD = {}
for obj in collection.find():
    newD[obj['_id']] = obj['value']
print newD
# output is: {u'string2': 2, u'string3': 3, u'string1': 1}

您只需要从 unicode 转换回来,这很简单。

关于python - 搁置对于大型词典来说太慢了,我该怎么做才能提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525280/

相关文章:

python - 如何在python中将包含数字和字符的向量转换为数值向量?

python - pandas groupby 并用另一列的第一个值减去一列的最后一个值

python - 如何使 Flask/Jinja2 加载可执行 zip 存档中的捆绑模板?

python - Django GenericRelated 字段条件查询引发 'GenericRelation' 对象没有属性 'field'

mysql - RDBMS 是否保证行级原子性?

sql - Oracle 10g - 链接两个具有不同用户权限的 View

php - 用于(大型)Python 项目的数据库引擎

php - 根据mysql中特定列数据过滤数据

c# - OLEDB读取Excel的性能

python - Keras tf 后端预测批量大小为 1 时速度较慢