1

Python で shelve を使用して、メモリに収まらない巨大な辞書を処理し、永続性を実現しています。

辞書のランダムな場所に頻繁に取得して挿入する必要があるコードを実行しているときに、シェルブが 4 GB の使用可能なメモリの約 3% しか使用していないことに気付きました。これにより、必要なディスクからの読み取り/書き込みの回数が増えるため、コードの実行が遅くなります。

メモリ内のヒット数が多くなるように、シェルフがより多くの使用可能なメモリ (たとえば ~50%) を使用するようにする方法はありますか?

4

2 に答える 2

0

Python とうまく統合できる ZODB またはその他のキーと値のストアを検討してください。保留/ピクルできるオブジェクトはすべて ZODB に入れることができます。shelve モジュールは、そのようなパフォーマンスや一貫性のために設計されているようには見えません。

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

pickleモジュールを使用して、そのオブジェクトをテキストとの間でシリアル化/非シリアル化する SQL ソリューションを使用することもできます。Shelve と ZODB の心臓部です。本当に冒険したい場合は、インメモリ SQLite DB を試すことができます。SQLite は Python にバンドルされています。

于 2011-09-23T13:33:47.563 に答える
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()
于 2014-05-15T04:37:36.687 に答える