1

我在 Python 中使用搁置来处理一个不适合内存的巨大字典,以及实现持久性。

在运行我的代码时,需要频繁检索和插入字典中的随机位置,我注意到搁置只使用了 4GB 可用内存的大约 3%。这导致我的代码运行速度变慢,因为需要从磁盘进行更多的读/写。

有没有办法让搁置使用更多的可用内存(比如~50%),这样内存中的命中次数就更高了?

4

2 回答 2

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()
于 2014-05-15T04:37:36.687 回答
0

考虑 ZODB 或其他与 Python 很好集成的键值存储。任何可以搁置/腌制的对象都可以进入 ZODB。shelve 模块似乎不是为那种性能或一致性而设计的。

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

您还可以使用 SQL 解决方案,使用pickle模块将该对象序列化/反序列化到文本。它是 Shelve 和 ZODB 的核心。如果您真的很喜欢冒险,可以尝试使用内存中的 SQLite DB。SQLite 捆绑在 Python 中。

于 2011-09-23T13:33:47.563 回答