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

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(使用前将#替换为@)

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

  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 如何在文件系统中存储图像

    目前 我已将图像 最大 6MB 作为 BLOB 存储在 InnoDB 表中 随着数据大小的增长 夜间备份变得越来越慢 阻碍了正常性能 因此 二进制数据需要进入文件系统 指向文件的指针将保存在数据库中 数据具有树状关系 main site u
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 处理大数据二进制文件

    我正在处理包含原始数据的大型二进制文件 每个大约 2 GB 这些文件具有明确定义的结构 其中每个文件都是一个数组events 每个事件都是一个数组data banks Each event and data bank有一个结构 header
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 如何优化分割重叠范围?

    我编写的这个 Python 脚本用于将重叠范围拆分为唯一范围 最后一次迭代 https codereview stackexchange com questions 285932 python script to split overlap
  • AStar-名称解释

    我正在寻找 AStar A 算法为何被称为 AStar 的解释 所有类似的 最短路径问题 算法通常都以其开发者的名字命名 那么 AStar 代表什么 有称为 A1 和 A2 的算法 后来证明A2是最优的 实际上也是可能的最好算法 所以他给它
  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本
  • 找到一个数是素数,为什么检查到n/2更好。避免n后半部分的数字的原因是什么

    要检查一个数是否是素数 最简单的方法是尝试将这个数除以 2 到 n 如果任何操作得到余数为 0 那么我们就说给定的数不是素数 但最好只进行划分和检查直到 n 2 我知道更好的方法是直到 sqrt n 我想知道跳过后半部分的原因 假设我们是否
  • pytesseract 无法从图像中识别复杂的数学公式

    我在用pytesseractpython 中的模块 pytesseract从图像中识别文本 但它不适用于包含复杂数学公式 例如根 推导 积分数学问题或方程 的图像 代码2 py Import modules from PIL import

随机推荐

  • 如何将 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 似乎是一种常用的结构 但