質問
現在、私は、値としてキーとクラスとして番号を持つ辞書を持っています。私はそうのようにそのクラスの属性にアクセスすることができます:
dictionary[str(instantiated_class_id_number)].attribute1
メモリの問題のためには、私がshelve
モジュールを使用します。そうすることが妥当と思われる場合、私は疑問に思って。棚は標準辞書とまったく同じ行動を辞書していますか?そうでない場合、それはどのように?異なりん。
解決
辞書にすでにあるオブジェクトを変更するときシェルブは、特に、extactly辞書と同じように動作しません。
違いは、辞書にクラスを追加するときに参照が格納されていることですが、棚には、漬物(連載)オブジェクトのコピー続けます。あなたは、オブジェクトを変更した場合、あなたは意志
メモリ内のコピーではなく、漬けバージョンを変更します。すなわち、透過shelf.sync()
及びshelf.close()
により(主に)扱うことができます
これは、エントリを書き出します。あなたはキャッシュをクリアするためにコールshelf.sync()を持っていないので、作業が戻ってまだ書かれていないすべての取り出されたオブジェクトを追跡する必要がないすべてのことになっています。
キャッシュをクリアshelf.sync()
の問題点は、オブジェクトへの参照を保持し、再びそれを修正することができるということです。
このコードでは、棚に期待通りの仕事をしませんが、辞書で動作します。
s["foo"] = MyClass()
s["foo"].X = 8
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9
それはバックを書かないように修正さ「P」オブジェクトがキャッシュから失われているので、同期がキャッシュをフラッシュします。
他のヒント
はい、それであるもっともらしくするます:
シェルフオブジェクトは辞書でサポートされているすべてのメソッドをサポートしています。これは、永続ストレージを必要とする辞書ベースのスクリプトからの移行が容易になります。
あなたはキャッシュをクリアするためにしょっちゅうshelf.sync()
を呼び出す必要があります。
EDIT
世話をする、それが正確にdict
ではありません。例えば参照してください。 Laurionの答えます。
ああ、あなただけstr
キーを持つことができます。