我在Python中使用shelve来处理一个不适合内存的大字典,以及实现持久性。
在运行我需要经常检索并插入字典中随机位置的代码时,我注意到搁架仅使用了4GB可用内存的3%左右。这导致我的代码运行得更慢,因为所需的磁盘读/写次数会更多。
有没有办法让搁置使用更多的可用内存(比如~50%),那么内存中的命中数会更高?
答案 0 :(得分:0)
考虑ZODB或其他与Python集成良好的键值存储。任何可以搁置/腌制的物体都可以进入ZODB。搁架模块似乎不是为了那种性能或一致性而设计的。
http://www.ibm.com/developerworks/aix/library/au-zodb/
您还可以使用 pickle 模块来获取SQL解决方案,以将该对象序列化/反序列化为文本。它是Shelve和ZODB的核心。如果你真的有冒险精神,你可以试试一个内存中的SQLite数据库。 SQLite捆绑在Python中。
答案 1 :(得分:0)
我也强烈推荐ZODB。您可以将搁置数据库移植到ZODB数据库,如下所示:
#!/usr/bin/env python
import shelve
import ZODB, ZODB.FileStorage
import transaction
from optparse import OptionParser
import os
import sys
import re
reload(sys)
sys.setdefaultencoding("utf-8")
parser = OptionParser()
parser.add_option("-o", "--output", dest = "out_file", default = False, help ="original shelve database filename")
parser.add_option("-i", "--input", dest = "in_file", default = False, help ="new zodb database filename")
parser.set_defaults()
options, args = parser.parse_args()
if options.in_file == False or options.out_file == False :
print "Need input and output database filenames"
exit(1)
db = shelve.open(options.in_file, writeback=True)
zstorage = ZODB.FileStorage.FileStorage(options.out_file)
zdb = ZODB.DB(zstorage)
zconnection = zdb.open()
newdb = zconnection.root()
for key, value in db.iteritems() :
print "Copying key: " + str(key)
newdb[key] = value
transaction.commit()