3

假设我有一个基于文件的数据结构,例如 B+ 树。我的理解是,数据预计存储在磁盘上,但索引通常加载在内存中。如果你有一个如此大的文件,甚至它的索引也不适合内存怎么办?这通常是如何处理的?其次,由于索引是一棵树,而不是一组线性数据,它通常如何在磁盘上布局?

我基本上很好奇它是如何在现实世界的项目中完成的(比如 Berkeley DB)。显然,我对广泛的笔触感兴趣。我希望得到一个想法,所以当我深入研究我的数据库书的 B-Tree 部分时,我有一些背景信息(或者从几年前的 CS XYZ 中回忆起我的记忆)

4

3 回答 3

2

B树适用于基于页面的系统,其中给定节点适合页面。要在 B 树中查找条目,一次只需要加载一页,因此您可以这样做。

即使更新它们也不需要大量页面同时在内存中 - 我想最困难的操作是在重组节点时删除,但如果它被仔细实施,即使这可以用相对较少的页面完成记忆。

于 2009-04-18T21:15:15.130 回答
1

您可能想看看SQLite代码库比Berkeley DB 小得多,它是公共领域的,它的组织和注释非常清晰,并且源代码外的文档非常好。教会了我很多关于现实世界中 btree 的知识

于 2009-04-18T21:27:46.190 回答
1

要回答你的第一个问题,一个太大而无法放入内存的数据结构通常被划分为“页面”,通常所有页面大小相同,每个页面包含数据结构的一部分,以使用您加载和卸载的数据页。

另一个常见的选项(在 RDBMS 中不常用,但在 XML 和媒体文件之类的东西中很常见)是流式传输,您可以通过加载下一部分并丢弃前一部分来按顺序处理数据。

这也回答了您的第二个问题,如果您使用分页而不是文件结构是一系列相同大小的页面,如果您使用流式传输,则数据应该按照您将要使用的顺序排列(在树的情况下,它可能是 DFS 或 BFS 顺序,具体取决于您的应用程序)。

于 2009-04-18T21:28:51.133 回答