1

現在、数値をキーとしてクラスを値として持つ辞書があります。次のように、そのクラスの属性にアクセスできます。

dictionary[str(instantiated_class_id_number)].attribute1

shelveメモリの問題により、モジュールを使用したいと考えています。そうすることがもっともらしいかどうか疑問に思っています。既製の辞書は標準の辞書とまったく同じように機能しますか? そうでない場合、どのように違いますか?

4

2 に答える 2

3

Shelve は、辞書とまったく同じようには機能しません。特に、既に辞書にあるオブジェクトを変更する場合はそうです。

違いは、クラスをディクショナリに追加すると参照が保存されますが、シェルブはオブジェクトのピクル (シリアル化) されたコピーを保持することです。次にオブジェクトを変更すると、メモリ内のコピーが変更されますが、ピクルされたバージョンは変更されません。これは、エントリを書き出す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」オブジェクトはキャッシュから失われ、書き戻されません。

于 2010-08-04T21:40:25.860 に答える
0

はい、もっともらしいです:

Shelf オブジェクトは、辞書でサポートされているすべてのメソッドをサポートしています。これにより、辞書ベースのスクリプトから永続ストレージを必要とするスクリプトへの移行が容易になります。

shelf.sync()キャッシュをクリアするには、頻繁に呼び出す必要があります。

編集

注意してください、それは正確にはdict. たとえば、Laurionの回答を参照してください。

strああ、あなたは鍵しか持てません。

于 2010-08-04T21:27:33.567 に答える