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

Pie*_*oni 13 python database performance persistence shelve

我使用python存储一个表,我需要持久性.

基本上我将表作为字典字符串存储到数字中.整个存放与搁置

self.DB=shelve.open("%s%sMoleculeLibrary.shelve"%(directory,os.sep),writeback=True) 
Run Code Online (Sandbox Code Playgroud)

我用writeback,True因为我发现如果不这样做,系统往往会不稳定.

在计算之后,系统需要关闭数据库并将其存储回来.现在数据库(表格)大约是540MB,而且需要很长时间.桌子增长到大约500MB后,时间爆炸了.但我需要一张更大的桌子.事实上我需要其中两个.

我可能正在使用错误的持久性形式.我该怎么做才能提高性能?

nea*_*ith 14

为了存储大型string : number键值对字典,我建议使用一个JSON本地存储解决方案,例如MongoDB.它有一个很棒的Python,Pymongo API .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}
Run Code Online (Sandbox Code Playgroud)

你只需要从unicode转换回来,这是微不足道的.


Sam*_*nen 10

根据我的经验,我建议使用Python附带的SQLite3.它适用于较大的数据库和关键数字.数以百万计的密钥和千兆字节的数据不是问题.Shelve在这一点上完全被浪费了.单独的db-process也没有用,它只需要更多的上下文交换.在我的测试中,我发现在本地处理大型数据集时,SQLite3是首选使用的选项.运行本地数据库引擎(如mongo,mysql或postgresql)不会提供任何其他值,也会更慢.