Zope 2 的 OFS 基于 BTree 的实现。
项目描述
概述
BTreeFolder2 是 Zope 产品,其作用类似于 Zope 2 OFS 文件夹,但可以存储更多项目。
当您在 Zope 文件夹中填满太多项目时,Zope 和您的浏览器都会不堪重负。Zope 必须加载和存储一个大型文件夹对象,并且浏览器必须重复呈现大型 HTML 表格。Zope 可以存储大量对象,但在单个标准文件夹中存储大量对象存在问题。
Zope Corporation 曾就此主题进行过广泛的讨论。我们决定扩展标准文件夹以优雅地处理大量对象。不幸的是,Zope 文件夹今天以多种方式使用和扩展,很难以与所有 Zope 产品兼容的方式修改标准文件夹。
于是 BTreeFolder 产品诞生了。它将所有子对象存储在 ZODB BTree 中,该结构旨在允许许多项目而不会将它们全部加载到内存中。它还将文件夹的内容呈现为简单的选择列表而不是表格。大多数浏览器都可以轻松呈现大型选择列表。
但是还有一个问题。BTreeFolders 仍然将所有子对象的 ID 存储在单个数据库记录中。如果您将数以万计的项目放在一个 BTreeFolder 中,您仍然会加载和存储数兆字节的文件夹对象。Zope 可以做到这一点,但不会很快,而且不会使数据库膨胀。
BTreeFolder2 解决了这个问题。它不仅在 BTree 中存储子对象,而且还存储子对象的 ID。它还对 UI 中的项目列表进行批处理,一次仅显示 1000 个项目。因此,如果您仔细编写应用程序,您可以使用 BTreeFolder2 来存储尽可能多的项目,以适应物理存储。
但是,有些产品依赖于原始 BTreeFolder 的内部结构。因此,与其冒险破坏这些产品,不如将产品重命名。您可以同时安装这两个产品。如果您正在开发新的应用程序,您应该使用 BTreeFolder2。
用法
BTreeFolder2 用户界面显示项目列表而不是一系列复选框。要访问一个项目,请在列表中选择它并单击“编辑”按钮。
BTreeFolder2 对象提供了类似于 Python 字典的方法,使它们在 Python 代码中比标准文件夹更易于使用:
has_key(key) keys() values() items() get(key, default=None) __len__()
keys()、values() 和 items() 返回序列,但不一定是元组或列表。使用 len(folder) 调用 __len__() 方法。values() 和 items() 返回的对象具有获取包装器。
BTreeFolder2 还提供了一种生成唯一、非重叠 ID 的方法:
generateId(prefix='item', suffix='', rand_ceiling=999999999)
此方法返回的 ID 保证不会与文件夹中的任何其他 ID 冲突。使用返回值作为新对象的 ID。生成的 ID 往往是连续的,以便可能以某种方式相关的对象一起加载。
BTreeFolder2 实现了完整的 Folder 接口,除了 superValues() 方法不返回任何项目。以 Zope 代码库预期的方式实现该方法将破坏使用 BTreeFolder2 获得的性能优势。
变更日志
4.3 (2021-04-26)
4.2 (2019-03-08)
在 setup.py ( Zope#481 )中使用python_requires指定支持的 Python 版本
放弃对 Python 3.4 的支持,因为 Zope 本身不支持它。
添加对 Python 3.8 的支持
4.1 (2018-10-05)
更多 PEP8 合规性。
为 Bootstrap ZMI 添加图标。
使用当前 API 避免弃用警告。
添加对 Python 3.7 的支持。
4.0.0 (2017-05-23)
添加了毒物配置
Python 3 兼容性
更新为需要并与 Zope 4 兼容。
3.0 (2016-07-18)
更新依赖项(没有 ZODB,但是 BTrees)
2.14.0 (2015-06-18)
要求 ExtensionClass >= 4.1a1(与 Zope 4 兼容)。
2.13.5 (2015-06-18)
添加了清理例程的案例,其中元类型索引包含不在树中的键。
2.13.4 (2011-12-12)
为BTreeFolder2Base.hasObject方法提供安全声明。
为正确的getattr行为添加一些测试。
次要的 __getattr__和_getOb优化。
2.13.3 (2011-03-15)
keys、values和items方法现在与 objectIds、objectValues和objectItems 完全相同。他们之前已经做过同样的事情,但复制了代码。
2.13.2 (2011-03-08)
当没有请求特殊规范时, objectValues和objectItems不再进行特殊处理,因为objectIds已经进行了正确处理。
2.13.1 (2010-08-04)
确保返回对象的方法将它们返回获取包装。
在调用我们自己的键、值和项目方法时要更加小心,因为子类可能已经覆盖了其中的一些。
2.13.0 (2010-07-11)
如果未传递规范参数,则将objectIds、objectItems和objectValues方法更改为直接使用内部 OOBTree 方法。
更改keys、items和values方法的实现以直接访问 self._tree OOBTree 方法。这避免了在 meta_types 结构中的查找。
实现完整的字典协议,包括__getitem__、 __delitem__、__setitem__、__nonzero__、__iter__和__contains__。
作为单独的包发布。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。