一种为对象数据库建立索引的方法

2024-02-16

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

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

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

这通过重复检查节省了大量时间,因为可以分析新对象,并且只需要检查在属性索引内相交的对象集。

然而,我很快就遇到了另一个关于更新对象时处理的问题。这些索引需要更新以反映它们可能不再准确的事实。这需要记住旧值以便可以直接访问它们并删除对象,或者迭代属性类型的所有值以便找到然后删除对象。不管怎样,性能很快又开始下降,我找不到解决它的方法。

您以前遇到过此类问题吗?你是怎么解决这个问题的,或者这只是我在使用 OODBMS 时必须处理的问题?

预先感谢您的帮助。


是的,repoze.catalog 很好,并且有详细的文档。

简而言之:不要将索引作为网站结构的一部分!

  1. 考虑使用容器/项目层次结构来存储和遍历内容项目对象;计划能够通过(a)路径(图形边缘看起来像文件系统)或(b)通过识别某个不同位置的单例容器来遍历内容。

  2. 使用 RFC 4122 UUID(uuid.UUID 类型)或 64 位整数标识您的内容。

  3. 使用中央目录进行索引(例如repoze.catalog);该目录应该位于相对于 ZODB 的根应用程序对象的已知位置。您的目录可能会索引对象的属性并在查询时返回记录 ID(通常是整数)。您的工作是将这些整数 ID 映射到(可能通过 UUID 间接)到您存储内容的数据库中的某个物理遍历路径。如果您使用 zope.location 和 zope.container 作为通用接口来从根/应用程序向下遍历对象图,这会有所帮助。

  4. 使用 zope.lifecycleevent 处理程序来索引内容并保持内容新鲜。

问题——普遍化

ZODB 太灵活了:它只是一个带有事务的持久对象图,但这为您在自己的数据结构和接口中沉浮或游泳留下了空间。

解决方案——通用化

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

更具体

只有当您用尽了通用的习惯用法并知道它们为什么不起作用时,才尝试使用 ZODB 中各种风格的 BTree 来构建您自己的索引。事实上,我这样做的次数超出了我愿意承认的范围,但通常都有充分的理由。

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

问题域的习语

  • 掌握 ZODB BTree:您可能想要:

    • 将内容对象作为持久性的子类存储在容器中,这些容器是提供容器接口的 OOBTree 的子类(见下文)。
    • 要为目录或全局索引存储 BTree,或者使用像 repoze.catalog 和 zope.index 这样的包来提取该详细信息(提示:目录解决方案通常将索引存储为 OIBTree,这将为搜索结果生成整数记录 id;然后您通常会得到一些一种文档映射器实用程序,它将这些记录 id 转换为应用程序中可解析的内容,例如 uuid(假设您可以遍历图形到 UUID)或路径(Zope2 目录的方式)。
  • 恕我直言,不要费心使用 intids 和关键引用等(如果您不需要它们,这些不太惯用并且更困难)。只需使用 repoze.catalog 中的 Catalog 和 DocumentMap 即可获取整数到 uuid 或路径形式的结果,然后弄清楚如何获取对象。请注意,您可能需要一些实用程序/单例来根据搜索返回的 id 或 uuid 来检索对象。

  • 使用 zope.lifecycleevent 或提供同步事件回调(处理程序)注册的类似包。每当对对象进行原子编辑时(可能每个事务一次,但不在事务机制中),您应该调用这些处理程序。

  • 学习 Zope 组件架构;不是绝对要求,但肯定有帮助,即使只是了解 zope.container 等上游包的 zope.interface 接口

  • 了解 Zope2 (ZCatalog) 是如何做到这一点的:目录前面有多个索引或各种排序,每个索引都搜索一个查询,每个索引都有专门的数据结构,每个索引都返回整数记录 id 序列。这些通过执行集合交集的目录在索引之间进行合并,并作为包含元数据存根的“大脑”对象的惰性映射返回(每个大脑都有一个 getObject() 方法来获取实际的内容对象)。从目录搜索中获取实际对象依赖于 Zope2 习惯用法,即使用根应用程序对象的路径来标识编目项目的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种为对象数据库建立索引的方法 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • 如何在 Windows 64 上安装 NumPy?

    NumPy 安装程序在注册表中找不到 python 路径 无法安装 需要 Python 2 5 版本 但在注册表中未找到该版本 OK 我必须修改注册表吗 我已经修改了 PATH 以指向Python25安装目录 我可以检查一下您使用的是什么安
  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • 为什么删除临时文件时出现WindowsError?

    我创建了一个临时文件 向创建的文件添加了一些数据 已保存 然后尝试将其删除 但我越来越WindowsError 编辑后我已关闭该文件 如何检查哪个其他进程正在访问该文件 C Documents and Settings Administra
  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 外部实体更改后索引不更新

    我目前正在开发一个项目 使用 JPA 2 1 保存数据并使用 hibernate search 4 5 0 final 搜索实体 映射类和索引后 搜索工作正常 但是 当我更改值时描述B 类从 someStr 到 anotherStr 数据库
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • 我可以在不安装 R 的情况下使用 R.Net

    我正在 C 中构建一个应用程序 并且我想在该应用程序中使用一些 R 库 我正在使用 R Net 来做到这一点 但是 我会将这个软件部署给那些计算机上可能没有下载 R 的用户 有什么方法可以使用 R dll 以便用户可以运行我的应用程序 而无
  • 移动一个精灵时所有精灵都不可见[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的场景中有 7 个精灵 所有精灵都添加到可变数组中 当我触摸一个精灵来移动时 其他精灵在我触摸移动方法后不可见 这是我的代码 if se
  • GMP mpz_array_init 是一个过时的函数 - 我们应该如何初始化 mpz 数组?

    只使用了GNU MP Bignum 库 https gmplib org index html dir有几次 我很感兴趣地发现我以前分配 启动数组的方式现在已经过时了 从整数特殊函数 https gmplib org manual Inte
  • Rails 3.1:有深度嵌套模型的教程吗?

    我正在寻找 Rails 3 1 的工作教程 该教程将逐步向您展示如何创建 3 层深度的嵌套模型 The 复杂形式 截屏视频 http railscasts com episodes 73 complex forms part 1在 Rail
  • AndroidAnnotations + Android Studio - 找不到生成的 null.R 类

    我已经使用最新版本的 AndroidStudio 按照 wiki 说明设置了 ActiveAndroid 我正在使用产品口味 这是我的 gradle 构建文件 apply plugin android apply plugin androi
  • 为什么 IE10 中的“font-size: 1em”比 Chrome 中的字体大?

    我目前正在开发一个网站 我不明白为什么文本在 IE10 中显示比在 Chrome 中更大 我已确保两个浏览器都设置为 100 缩放 不多也不少 我的 CSS 已重置 body font size 1em 在 Chrome v27 0 145
  • 如何使用 ggplot2 在同一绘图区域内绘制绘图的缩放?

    这个问题看起来很难理解 但是为了说明一下 我举个图来举例 我正在尝试复制这张图 到目前为止 我已经单独完成了图形 但我不知道如何将它们组合在一起 如示例所示 有什么帮助吗 time lt seq from 0 to 10 by 0 5 li
  • 文件夹被锁定,无法解锁

    当我尝试更新或提交项目中的代码时 它告诉我该文件夹已锁定 当我尝试 释放锁定 时 它说该工作空间中没有任何内容可以解锁 这意味着什么 为什么我无法更新 提交甚至清理项目 右键单击您的 Subversion 工作目录文件夹 然后选择Torto
  • 在 Macos 上,rails new 失败并显示“无法设置其他经过身份验证的数据”

    我正在尝试让 ruby on Rails 在带有 M1 芯片的新 Mac 上运行 跑步rails new之后失败append gitignore出现以下错误 Library Ruby Gems 2 6 0 gems activesuppor
  • VS2010 程序集加载错误

    当我尝试在 Visual Studio 2010 中构建 ASP NET 4 项目时 出现以下错误 无法加载文件或程序集 file C Dev project trunk bin Elmah dll 或其依赖项之一 不支持操作 HRESUL
  • 如何将容器作为服务的参数

    在我的服务构造函数中 public function construct EntityManager entityManager SecurityContextInterface securityContext this gt securi
  • Tastypie 和原始 sql

    如何让 Tastypie 获取原始 SQL 查询集 queryset Foo objects raw sql 似乎不起作用 难道不可能吗 queryset super class name self get query set return
  • runnodes 时发生非法反射访问操作

    我正在尝试运行我的 corda 节点 但我遇到了一个奇怪的问题 节点正在正确启动 正如您在日志中看到的那样 C Repositorio cordapp template kotlin build nodes gt runnodes log
  • 如何在 Python (2.7 + ) 中等待 ENTER 键按下? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道一种简单的方法来等待用户按下特定的键 例如 Enter 或 Escape 但不是两者 然后在感应到按键后进一步执行代码 Try r
  • 如何在 Laravel 项目中添加 jQuery

    我是 Laravel 框架的新手 我想在使用 Laravel 框架构建的 Web 应用程序中使用 jQuery 但不知道怎么链接jQuery 库在 Laravel 项目中 你可以使用在线图书馆
  • 在数据框的列上进行 Strsplit [重复]

    这个问题在这里已经有答案了 我有一个data frame其中变量之一是向量 或列表 如下所示 MyColumn lt c A B C D E F G MyDF lt data frame group id 1 4 val 11 14 cat
  • 如何使用正则表达式搜索带括号的字符串?

    我有一个 txt 文件 其中包含以下字符串 A 123 B 456 Ab 123 我想搜索Ab 123 在txt文件中 我尝试过的 re search r Ab 123 string 有 12 个具有特殊含义的字符 您可以使用以下命令转义到
  • 与 preg_match_all 匹配

    我得到这个正则表达式 val 123 4 56 regex preg match all regex val matches 谁能告诉我为什么这只匹配最后一个数字 56 而不是每组数字 这是上面的正则表达式运行后 matches 包含的内容
  • 使用不带 InvokePattern 或 clickablePoint 的 UI Automation在单击按钮时调用

    我尝试将点击消息发送到 或调用 另一个应用程序中的按钮 我使用 UISpy exe 并可以找到我需要的元素 但它没有 id 没有 clickablePoint 也没有 Invoke 模式 我尝试了以下代码 var processStartI
  • 一种为对象数据库建立索引的方法

    我正在使用对象数据库 ZODB 来存储许多对象之间的复杂关系 但遇到了性能问题 因此 我开始构建索引以加快对象检索和插入速度 这是我的故事 希望对您有所帮助 最初 当我向数据库添加对象时 我会将其插入专用于该对象类型的分支中 为了防止多个对