用于可变长度记录存储和仅在主键上搜索的磁盘查找的数据结构/算法

2023-12-27

我正在寻找一种适用于基于大型块的设备(例如机械硬盘驱动器)的算法/数据结构,该结构针对插入、获取、更新和删除进行了优化,其中搜索始终使用数据的 id 进行,并且数据在何处任何 ID 的字段都有可变长度。

B-Tree 似乎是一种常用的结构,但主要用于固定长度的记录。我还期望获取和更新比插入和删除要多得多。我可以摆脱 B 树的 O(log m) 查找吗?

我很高兴它是一个组合系统,例如 ISAM 组合了 B 树和线性文件存储,看起来它可以作为一种方法来处理可变长度记录。还有更好的吗?

一些进一步的限制:

1) ID 可能是稀疏的,但可以将它们制成线性数字块 - 但范围很大(64 位)

2)我不想使用DBMS,我的特定问题的性能还没有被证明很好。我不需要完整的 DBMS 使用的任何操作,我不需要搜索。我需要一些可以轻松调整和优化的东西。称之为学术好奇心,如果 MySQL 无法胜任,那么我会使用它,但我必须尝试更快。

3)数据集比内存大,但是如果索引像键、偏移量一样简单,那么索引可能很适合内存。我当然会在存储中查看大约 10 亿个或更多的实体。

4) 理想情况下,删除记录时应恢复空间。这可能是通过压缩来实现的,但我有兴趣看看是否有更好的方法(例如,B 树可以轻松恢复空间)。


简单的方法:使用 Berkeley DB 之类的东西。它为任意字节字符串提供键值存储,并为您完成所有艰苦的工作。如果您需要的话,它甚至还提供用于索引的“辅助数据库”。

DIY 方式:使用 Protocol Buffers(或您选择的二进制格式)来定义 B 树节点和数据项结构。对数据库使用仅附加文件。要写入新记录或修改现有记录,只需将记录本身写入文件末尾,然后写入任何修改的 B-Tree 节点(例如,记录的父节点、its父节点,依此类推直到根)。然后,将树的新根的位置写入文件开头的标头块。要读取该文件,您只需找到最近的根节点并像读取任何其他文件一样读取 B 树。这种方法有几个优点:

  • 由于写入的数据永远不会被修改,因此读取器不需要锁定,并根据开始读取时的根节点获取数据库的“快照”视图。
  • 通过将“先前版本”字段添加到节点和记录中,您基本上可以免费访问数据库的先前版本。
  • 与大多数支持修改的磁盘文件格式相比,它确实很容易实现和调试。
  • 压缩数据库只需读出最新版本的数据和 B-Tree 并将其写入新文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于可变长度记录存储和仅在主键上搜索的磁盘查找的数据结构/算法 的相关文章

  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 在一个区域中拟合二维多边形的算法?

    这有标准吗 算法名称 说 我有 10 个不同大小的多边形 我有一个特定大小的区域 我想知道如何填充该区域中的最多多边形 以及它们是如何拟合的 笔记 多边形可以根据限制集进行旋转 一个可能的名称是包装问题 http en wikipedia
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 当满足动态条件时退出递归函数

    使用来自的函数生成汉明距离 t 内的所有比特序列 https stackoverflow com questions 40813022 generate all sequences of bits within hamming distan
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • 数组所有可能的组合

    我有一个字符串数组 ted williams golden voice radio 我希望这些关键字的所有可能组合采用以下形式 ted williams golden voice radio ted williams ted golden
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • C++中向量是如何实现的

    我正在考虑如何实施std vector从头开始 它如何调整向量的大小 realloc似乎只适用于普通的旧结构 还是我错了 它是一个简单的模板类 它包装了一个本机数组 它does not use malloc realloc 相反 它使用传递
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 双向链表转 JSON

    我有一个三维结构 实际上是一个具有六个节点的双向链表 即左 右 上 下 进 出 如果一个节点位于另一个节点的右侧 那么该节点将毫无疑问位于第一个节点的左侧 喜欢 实际上这是一个 3D 结构 但为了便于理解 我给出了一个 2D 示例 现在我必
  • 相当于字典的数据结构?

    我正在使用 JavaScript 工作 希望保留一份设置的公里 英里 小时近似值列表 我无法以编程方式进行转换 我正在使用需要某些值的外部 API 因此它确实必须是等效的字典 目前我正在使用一个对象 var KM MPH 10 16 12
  • 如何以最低的价格优化购物车?

    我有一个我想买的物品清单 这些商品由不同的商店提供 价格也不同 商店有单独的送货费用 我正在寻找一种最佳的购物策略 以及支持它的java库 以最低的总价购买所有商品 Example 商品 1 在 Shop1 的售价为 100 美元 在 Sh
  • 有向未加权图中的最长非循环路径

    什么算法可用于找到未加权有向无环图中的最长路径 动态规划 http en wikipedia org wiki Dynamic programming 它也被引用于最长路径问题 http en wikipedia org wiki Long
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 先增后减的最长子序列

    我正在尝试解决以下问题 元素值先减小后增大的序列称为V序列 在有效的 V 序列中 递减臂中应至少有一个元素 递增臂中至少应有一个元素 例如 5 3 1 9 17 23 是一个有效的 V 序列 在递减臂中具有两个元素 即 5 和 3 在递增臂

随机推荐

  • 如何将 iPhone-Wax 嵌入到应用程序中

    我刚刚了解了 iPhone Wax 感谢 SO 现在 对于我想要做的事情来说 文档相当稀疏 我想将它嵌入到 Objective C 应用程序中 我不希望它成为主要应用程序 有人做到了吗 我怎样才能实现它 我想以与使用 LuaObjectiv
  • 如何将 XDebug zend_extension 添加到 php.ini?

    我有一个带有 cPanel WHM 的 VPS 并且正在尝试启用 XDebug 我通过以下方式安装了扩展程序WHM gt Software gt Module Installers gt PHP Pecl gt Manage我通过检查我的p
  • 如何替换数组的元素?

    如何替换数组中的元素 a 1 2 3 4 5 我需要将 5 替换为 11 22 33 44 flatten so that a现在变成 a 1 2 3 4 11 22 33 44 不确定您是否想要替换特定值 但这有效 a 1 2 3 4 5
  • 如何获取 crtdbg.h 文件?

    我在用MinGW http en wikipedia org wiki MinGW GCC Eclipse http en wikipedia org wiki Eclipse 28software 29在 Windows 上 我遇到了这个
  • 如何悬停固定元素直到到达某个点

    我有一个 div 需要将其固定在屏幕底部 直到滚动到某个点并停在那里并停留 如果用户开始向后滚动 在经过同一点后再次将其固定 关于如何实现这一点有什么想法吗 编辑 这是我当前的代码 不起作用 window scroll function i
  • SQl:从文本文件更新表

    这是我必须做的 我有一个包含 3 列的文本文件 PID X Y 现在我的数据库中有两个表 Table 1包含 4 列 UID PID X Y Table 2包含多列 必需的列是UID X Y 我需要更新Table 2具有相应的 X 和 Y
  • 如何用正则表达式模式替换文本并在替换文本中集成计数器?

    function parse string counter 0 string preg replace b b si span class b counter 1 span string 1 counter return string 我正
  • ggplot2 中两种不同颜色美学映射的不同调色板

    我的问题非常类似于this https stackoverflow com questions 15363035 ggplot2 how to specify multiple fill colors for points that are
  • D3 旭日。如何设置不同的环\层宽度

    帮助 我已经搜索了很长时间 但没有找到任何与此相关的信息 我基本上希望能够设置 D3 sunburst 中每个图层的大小 像素 相对 我不介意 我猜这可以在数据或基于数字或父母的代码中完成 我有一个旭日纹 希望内环占据大部分空间 而外环只是
  • 存储过程 azure Cosmos DB 返回空集合

    我尝试使用 Azure 文档中的示例 sp 创建代码创建存储过程 但无法获取集合详细信息 它总是返回 null 存储过程 SAMPLE STORED PROCEDURE function sample prefix var collecti
  • 拖动 JPanel

    我在尝试拖动 JPanel 时遇到问题 如果我纯粹在 MouseDragged 中将其实现为 public void mouseDragged MouseEvent me me getSource setLocation me getX m
  • MongoDB 字段数组搜索(C#,如何?)

    请告诉我如何通过字段数组进行搜索 我有一些类型的字段List
  • 我应该修改 String 的原型吗?

    我本来打算在 javascript 中创建一个修剪函数 但由于我不想重新发明轮子 所以我在谷歌上搜索了这个方法 我找到了这个链接http www somacon com p355 php http www somacon com p355
  • 比较两个对象(不包括一些属性)的最快方法?

    我有一个网站 用户将数据上传到其中 我只想更新属性已更改的数据 因此 我正在比较 2 个相同类型的对象的更改 并且我需要排除一些属性 例如 ModifiedOn 日期 这是迄今为止我使用反射的代码 private bool hasChang
  • 无法在Jboss EAP 7.0服务器中创建oracle数据源

    我需要在JBOSS EAP 7 0服务器中创建oracle数据源 我部署了ojdbc6 jar从 JBOSS 管理 CLI 命令行界面 使用以下命令 deploy
  • 计算时差超过 24 小时

    我遇到一个问题 我试图计算以秒为单位的时间差 然后在报告 访问报告 中我将总结这些秒并将其格式化为 hh nn ss 但是 我收集两个字段之间的时间差的计算字段有时会超过 24 小时 从而消除了时间差 我正在使用 DateDiff 函数 D
  • 有关 EF Code First Fluent API、TPH 和外键的困难

    我的数据库中有两个表 一种叫做Users 另一个称为Widgets The Widgets表代表我的代码模型中的 3 个实体 其中一个实体 Widget 是其他两个实体的父类 WidgetTypeA and WidgetTypeB Both
  • g++ 编译和链接选项

    也许是天真的问题 g 是否有单独的编译和链接选项列表 我的意思是一个显示哪些选项用于编译 哪些选项用于链接的列表 gcc 手册说这些是链接选项 http gcc gnu org onlinedocs gcc Link Options htm
  • 如何在长时间运行的功能期间更新 UI(文本字段)?

    我知道这个问题可能没有意义 而且我很难想出一种方法来解释它 所以我将展示一段代码来提供帮助 我在 Visual Studio Express 2010 上使用 Winforms private void button1 object sen
  • 用于可变长度记录存储和仅在主键上搜索的磁盘查找的数据结构/算法

    我正在寻找一种适用于基于大型块的设备 例如机械硬盘驱动器 的算法 数据结构 该结构针对插入 获取 更新和删除进行了优化 其中搜索始终使用数据的 id 进行 并且数据在何处任何 ID 的字段都有可变长度 B Tree 似乎是一种常用的结构 但