いつ PersistentDict を使用する必要があり、いつフォルダーを使用する必要がありますか? 更新、内部構造、パフォーマンスなどの点で、それらの違いは何ですか?
2 に答える
Aは、ZODB の Persistence セマンティクスに合わせて調整された(標準ライブラリの基本クラスを介した) PersistentMapping
python 型の単なる実装です。を変更するたびに、継承する最も近いクラスにフラグを設定する必要がなくなります。dict
UserDict
_p_changed
Persistent
mapping
AFolder
はより豊富なタイプで、イベントの実装、Zope Web インターフェイス (ZMI) との統合、Web 経由の任意のプロパティ (タイプ検証を伴う属性)、Zope パーミッションの管理、サブアイテム ID の検証、インポート/エクスポート、サブアイテム フォルダーはオブジェクト自体の属性として保存され、一部のメタデータはインスタンスのプライベート dict に保存されます。
Folder
これらの追加サービス (アクセス許可の委任、ID 検証など) が必要な場合は a を使用し、それ以外の場合は a を使用しますPersistentMapping
。アイテムの検索や保存のパフォーマンスはそれほど変わりません。dict
1 つは直下のPythonで、もう 1 つは__dict__
アイテムを格納するインスタンスです。
競合の回避を探している場合は、 BTrees を調べる必要があります。クラスOOBTree
は基本的に、値が永続的なバケットに格納される永続的なマッピングであり、ほとんどの場合衝突を回避し、残りの競合の解決を提供します。
ストレージ セマンティクスFolder
を使用したセマンティクスが必要な場合は、 Products.BTreeFolder2と、インターフェースを実装するがサブオブジェクトをインスタンスの属性として直接ではなく に格納するアドオンを見てください。BTree
Folder
OOBTree
PersistentDict (現在は PersistentMapping と呼ばれています)は、 UserDict.IterableUserDictおよびpersistent.Persistentから継承するクラスです。
UserDict.IterableUserDictは、反復可能な辞書をシミュレートする組み込みの Python クラスであり、persistent.Persistentは、それ自体のインスタンスを ZODB に保存できるようにする Zope クラスです。
したがって、PersistentDict (または PersistentMapping) は基本的に、ZODB にオブジェクトとして格納できる辞書です。
通常の辞書は、ZODB に個別のオブジェクトとして格納することはできません。これらは、 persistent.Persistentから継承する何らかのクラスの属性でなければなりません。
PersistentDict は、そのキーと値を実際の辞書 (データ属性) 内に格納します。
PersistentDict は ZMI を介して追加することはできません。これは主に、辞書を直接 zodb に格納したいという特別な場合を対象としていると思います。
フォルダーとは、 zope.container.folder内のフォルダーを意味していると思います。Folder は、大量のオブジェクトを保持できるコンテナーである OOBTree オブジェクト内にその子を格納します。
他のコンテンツ タイプのインスタンスを含むコンテナーが必要な場合は、代わりにフォルダーを使用する必要があります。
フォルダーには、PersistentDict にはないインターフェイスがあり、これらのインターフェイスは、特定のアダプターまたは他のコンポーネントが機能するために必要になる場合があります。たとえば、ContainerModifiedイベントは、PersistentDict ではなく、Folder が変更されたときにのみ発生します。PersistentDict を汎用フォルダーとして使用する場合、このようなさまざまな問題が発生する可能性があります。
パフォーマンスに関して言えば、キースペースが非常に大きくなるまでは通常、ディクショナリの方が高速です。次に、天秤は OOBTree に向かって傾けられます。