4

什么时候应该使用 PersistentDict,什么时候应该使用 Folder?它们在更新、内部结构、性能等方面有什么区别?

4

2 回答 2

3

APersistentMapping只是针对 ZODB 的持久性语义调整的 pythondict类型的实现(通过标准库基类);UserDict它不必在_p_changed每次Persistent更改mapping.

AFolder是一个更丰富的类型,实现事件,与 Zope Web 界面 (ZMI) 集成,通过 Web 任意属性(具有类型验证的属性),Zope 权限管理,子项 ID 验证,导入/导出,等。子项目文件夹存储为对象本身的属性,一些元数据存储在实例的私有字典中。

Folder当您需要任何这些额外服务(授权、身份验证等)时使用 a,否则PersistentMapping使用 a。在性能方面查找或存储项目不会有太大差异;一个是下面的直蟒,另一个是存储项目dict的实例。__dict__

如果您正在寻找避免冲突,您应该查看BTreesOOBTree该类基本上是一个持久映射,其中值存储在持久存储桶中,在大多数情况下避免冲突,并为其余情况提供冲突解决方案。

如果您想要Folder具有BTree存储语义的语义,请查看Products.BTreeFolder2和实现Folder接口但将子对象存储在 aOOBTree而不是直接在实例上作为属性的附加组件。

于 2012-02-29T20:36:03.553 回答
2

PersistentDict(现在称为PersistentMapping)是一个继承自UserDict.IterableUserDictpersistent.Persistent类。

UserDict.IterableUserDict是一个内置的python 类,它模拟可迭代字典和持久化。Persistent是一个Zope 类,它可以将自身的实例保存在ZODB 中。

所以 PersistentDict(或 PersistentMapping)基本上是一个字典,可以作为对象存储在 ZODB 中。

普通字典不能作为单独的对象存储在 ZODB 中。它们必须是继承自persistent.Persistent的某个类的属性。

PersistentDict 将其键和值存储在实际字典(数据属性)中。

PersistentDict 不能通过 ZMI 添加,我认为它主要用于您希望将字典直接存储在 zodb 中的特殊情况。

对于文件夹,我猜你的意思是zope.container.folder中的文件夹。文件夹将其子项存储在 OOBTree 对象中,该对象是一个可以容纳大量对象的容器。

当您想要一个包含其他内容类型实例的容器时,您应该使用文件夹。

文件夹具有 PersistentDict 没有的接口,并且某些适配器或其他组件可能需要这些接口才能工作。例如,ContainerModified事件只会在文件夹被修改时触发,而不是 PersistentDict。如果您使用 PersistentDict 作为通用文件夹,可能会有各种类似的陷阱。

在性能方面,字典通常会更快,直到键空间变得非常大。然后将天平向 OOBTree 倾斜。

于 2012-02-29T17:20:09.623 回答