質問

私は私が処理することをDBに保存されているいくつかのデータを持っています。私は何の処理の前に、辞書内のすべてのデータをロードすることを決めたので、DBへのアクセスは、痛々しいほど遅いです。ただし、保存されたデータの巨大なサイズのため、私は(私は2本の以上のライブを使用して参照)がメモリ不足エラーを取得します。だから私は、ディスクのデータ構造を使用することを決めた、と棚を使用することはオプションであることが分かりました。だここで私は何をすべきか(擬似Pythonコード)

def loadData():
    if (#dict exists on disk):
        d = shelve.open(name)
        return d
    else:
        d = shelve.open(name, writeback=True)
        #access DB and write data to dict
        # d[key] = value 
        # or for mutable values
        # oldValue = d[key]
        # newValue = f(oldValue)
        # d[key] = newValue 
        d.close()
        d = shelve.open(name, writeback=True)
        return d

私は質問のカップルを持っている、

1)は、私は本当にライトバック= Trueが必要ですか?それが?何をするん

2)私は、データがディスクに書き込まれているとき以上の任意のコントロールを行使していないので、私はまだ、のOutOfMemory例外を取得します。それ、どうやったら出来るの?私は()ごとに数回の反復を同期をやってみましたが、それはどちらか助けていない。

ありがとうございます。

役に立ちましたか?

解決

writeback=True力の棚には、これまでにフェッチされたメモリ内の任意の項目を維持し、棚が閉じているときに戻ってそれらを書き込みます。だから、それは多くのメモリ、およびクロージング遅くなるが消費されます。

ただ

-

パラメータの利点は、それとの、あなたのんではないのは、あなたがそのミューテータメソッドで変更可能な項目のためにあなたのコメントに表示ねじ曲げコードが必要です

shelf['foobar'].append(23)
それは黙って何も操作しないだろうがshelfがライトバックなしで開かれた場合、作品('foobar'がライトバック有効にして開かれた場合)、キーshelfでアイテムと仮定すると(変わらず、ディスク上のアイテムを残して)、当然のリストです - - 後者の場合には、あなたが実際にコードの必要性を行う

thelist = shelf['foobar']
thelist.append(23)
shekf['foobar'] = thelist
あなたのコメントの精神で

- 文体やや残念のである。

ただし、以来、のメモリ問題を抱えて、私は間違いなく、この怪しげなライトバックオプションを使用してのありませんをお勧めされています。私はそれを実装する最初の提案および1だったので、「怪しげな」それを呼び出すことができると思いますが、何年も前だったこと、そして私はほとんどそれをやって悔い改めました - それは、それよりも(自分のQの証拠として)以上の混乱をgenerales優雅さと扱いやすさは、もともとdictsで動作するように書かれたコードに移動可能(最初のイディオムを使用する、しない第二の、そして従ってトレースバックすることなく棚で使用可能にするために書き換える必要があります)。よくああ、申し訳ありませんが、それはの時に良いアイデアに思えるんでした。

他のヒント

sqlite3モジュールを使用すると、おそらくここにあなたの最良の選択です。あなたは、そのメモリフットプリントがとにかくPythonオブジェクトを使用するよりも少し小さいかもしれませんので、とにかくメモリにsqliteの完全使用することができるかもしれません。これは、一般的に、とにかくshelveを使用するよりも良い選択です。 shelveは、あなたが望むことはほとんどありませんこれは、pickle下を使用します。

地獄、あなただけのsqliteデータベースにあなたの全体の既存のデータベースを変換することができます。 sqliteのが速い素晴らしく、です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top