gpt4 book ai didi

python - 索引对象数据库的方法

转载 作者:太空狗 更新时间:2023-10-30 00:52:00 26 4
gpt4 key购买 nike

我正在使用对象数据库(ZODB)来存储许多对象之间的复杂关系,但是却遇到了性能问题。结果,我开始构造索引以加快对象检索和插入的速度。这是我的故事,希望您能提供帮助。

最初,当我将对象添加到数据库时,我会将其插入专用于该对象类型的分支中。为了防止代表同一实体的多个对象,我添加了一种方法,该方法将遍历分支中的现有对象以查找重复项。这项工作起初有效,但是随着数据库规模的增长,将每个对象加载到内存和检查属性所花费的时间呈指数级增长,而且令人无法接受。

为了解决该问题,我开始根据对象中的属性创建索引,以便在添加对象时将其保存在类型分支以及属性值索引分支中。例如,假设我要保存一个具有firstName ='John'和lastName ='Smith'属性的人员对象,则该对象将附加到人员对象类型分支,并且还将附加到具有键'的属性索引分支中的列表。约翰”和“史密斯”。

由于可以分析新对象,并且只需要检查在属性索引内相交的对象集,因此可以节省大量时间进行重复检查。

但是,在更新对象时,我很快遇到了另一个问题。索引将需要更新以反射(reflect)它们可能不再准确的事实。这需要记住旧值以便可以直接访问它们并删除对象,或者遍历属性类型的所有值以便找到然后删除对象。不管哪种方式,性能都很快开始再次下降,我想不出一种解决方法。

您以前有过这种问题吗?您解决了什么问题,或者这是使用OODBMS时我必须处理的事情?

预先感谢您的帮助。

最佳答案

是的,repoze.catalog很不错,而且有据可查。

简而言之:不要使索引成为您网站结构的一部分!

  • 看一下使用容器/项目层次结构来存储和遍历内容项目对象;计划能够通过(a)路径(图形边缘看起来像文件系统)或(b)通过在某些不同位置识别单例容器来遍历内容。
  • 使用RFC 4122 UUID(uuid.UUID类型)或64位整数标识您的内容。
  • 使用中央目录进行索引(例如repoze.catalog);目录应位于相对于ZODB根应用程序对象的已知位置。并且您的目录可能会索引对象的属性并在查询时返回记录ID(通常是整数)。您的工作是将这些整数id映射到(也许通过UUID插入)到您要存储内容的数据库中的某些物理遍历路径。如果将zope.location和zope.container用于公共(public)接口(interface),以便从根目录/应用程序向下遍历对象图,则将很有帮助。
  • 使用zope.lifecycleevent处理程序来索引内容并保持内容新鲜。

  • 问题-广义

    ZODB太灵活了:它只是一个带有事务的持久对象图,但这为您沉没或游入自己的数据结构和接口(interface)留出了空间。

    解决方案-广义

    通常,只需从ZODB周围的社区中选择已有的习惯用法即可:zope.lifecycleevent处理程序,使用zope.container和zope.location进行“容器式”遍历,以及诸如repoze.catalog之类的东西。

    更特别

    仅当您穷尽了通用习语并知道为什么它们不起作用时,才尝试使用ZODB中各种风格的BTree构建自己的索引。实际上,我所做的超出了我的意愿,但通常有充分的理由。

    在所有情况下,请保持索引(搜索,发现)和站点(遍历和存储)的结构不同。

    问题域的成语
  • 主ZODB B树:您可能想要:
  • 将内容对象作为Persistent的子类存储在作为OOBTree提供容器接口(interface)的子类的容器中(请参见下文)。
  • 要为您的目录或全局索引存储BTree或使用诸如repoze.catalog和zope.index之类的包来抽象该细节(提示:目录解决方案通常将索引存储为OIBTree,这些索引将为搜索结果生成整数记录ID;然后,您通常拥有某种文档映射器实用程序,可将这些记录id转换为应用程序中可解析的内容,例如uuid(前提是您可以将图形遍历到UUID)或路径(Zope2目录的方式)。
  • 恕我直言,不要费心使用intids和key-references之类的东西(这些习惯用法较少,如果不需要它们,则更加困难)。只需使用来自repoze.catalog的Catalog和DocumentMap即可将结果以整数转换为uuid或路径形式,然后确定如何获取对象。请注意,您可能想要一些实用程序/单例,其功能是根据搜索返回的id或uuid来检索对象。
  • 使用zope.lifecycleevent或提供同步事件回调(处理程序)注册的类似程序包。每当对对象进行原子编辑时(可能每个事务执行一次,但不在事务处理机制中进行一次),就应该调用这些处理程序。
  • 了解Zope组件架构;这不是绝对的要求,但肯定有帮助,即使只是了解zope.container
  • 等上游软件包的zope.interface接口(interface)
  • 了解Zope2(ZCatalog)的工作方式:一个目录正面包含多个索引或各种索引,每种索引用于搜索查询,每种索引都有专门的数据结构,并且每种返回整数记录id序列。这些目录通过设置交集的目录在索引之间进行合并,并作为包含元数据 stub 的“大脑”对象的懒惰映射返回(每个大脑都有一个getObject()方法来获取实际的内容对象)。从目录搜索中获取实际对象依赖于Zope2习惯用法,即使用来自根应用程序对象的路径来标识已分类项目的位置。
  • 关于python - 索引对象数据库的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668234/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com