控制shelve使用的内存

1 投票
2 回答
668 浏览
提问于 2025-04-17 02:55

我在用Python的shelve模块来处理一个很大的字典,这个字典太大了,放不进内存里,同时我也想让数据能够保存下来。

在运行我的代码时,我发现这个shelve模块只用了大约4GB可用内存的3%。这导致我的代码运行得比较慢,因为需要从硬盘读取和写入的数据变多了。

有没有办法让shelve使用更多的可用内存(比如说大约50%),这样内存中的访问次数就会增加?

2 个回答

0

我也非常推荐ZODB。你可以像这样把你的shelve数据库转换成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()
0

可以考虑使用ZODB或者其他与Python配合得很好的键值存储。任何可以被存储或序列化的对象都可以放进ZODB。相比之下,shelve模块似乎并不是为了提供那种性能或一致性而设计的。

http://www.ibm.com/developerworks/aix/library/au-zodb/

你也可以选择使用SQL解决方案,配合pickle模块将对象转成文本格式,或者从文本格式转回来。这是Shelve和ZODB的核心。如果你想尝试一些更有挑战性的东西,可以试试内存中的SQLite数据库。SQLite是Python自带的。

撰写回答