当PersistentDict,当文件夹?

时间:2012-02-29 16:02:18

标签: python zodb repoze.bfg

我何时应该使用PersistentDict,何时应该使用文件夹?它们在更新,内部结构,性能等方面有何区别?

2 个答案:

答案 0 :(得分:3)

PersistentMapping只是python dict类型的一个实现(通过标准库UserDict基类),根据ZODB的Persistence语义进行调整;每次更改_p_changed时,都不必在最近的类上设置Persistent标记,该标记从mapping继承。

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

当您需要任何额外服务(权限委托,ID验证等)时,请使用Folder,否则请使用PersistentMapping。性能明智的查找或存储项目不会有太大差别;一个是下面的直接python dict,另一个是存储项目的实例__dict__

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

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

答案 1 :(得分:2)

PersistentDict (现在称为 PersistentMapping )是一个继承自 UserDict.IterableUserDict persistent.Persistent

UserDict.IterableUserDict 是一个内置的python类,它模拟一个可迭代的字典, persistent.Persistent 是一个Zope类,它允许自己的一个实例保存在ZODB。

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

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

的某些类的属性

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

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

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

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

文件夹具有PersistentDict没有的接口,某些适配器或其他组件可能需要这些接口才能工作。例如, ContainerModified 事件仅在修改Folder时触发,而不是PersistentDict。如果你使用PersistentDict作为通用文件夹,可能会有各种各样的问题。

在性能方面,字体通常会更快,直到密钥空间变得非常大。然后比例尺向OOBTree倾斜。