9

私は、さまざまなイベントのログである .txt ファイルを読み取り、それらのイベントの一部を辞書に書き込むタスクを割り当てられました。

問題は、ファイルのサイズが 3GB を超える場合があることです。これは、辞書が大きくなりすぎてメイン メモリに収まらないことを意味します。Shelveはこの問題を解決する良い方法のようですただし、常に辞書を変更するため、writebackオプションを有効にする必要があります。これは私が懸念しているところです - チュートリアルでは、これにより読み取り/書き込みプロセスが遅くなり、より多くのメモリが使用されると書かれていますが、速度とメモリがどのように影響を受けるかに関する統計を見つけることができません.

writeback オプションを使用するか、コード効率のために読みやすさを犠牲にするかを決定できるように、読み取り/書き込み速度とメモリがどの程度影響を受けるかを明確にすることはできますか?

ありがとうございました

4

1 に答える 1

2

このサイズのデータ​​ベースの場合、shelf は実際には不適切なツールです。可用性の高いクライアント/サーバー アーキテクチャを必要とせず、TXT ファイルをメモリ内でアクセス可能なローカル データベースに変換するだけの場合は、ZODBを使用する必要があります。

可用性の高いものが必要な場合は、当然のことながら、多くの選択肢がある正式な「NoSQL」データベースに切り替える必要があります。

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() 

于 2015-05-30T03:03:34.387 に答える