大于内存数据结构以及它们通常如何处理

时间:2009-04-18 21:11:27

标签: data-structures b-tree

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

我基本上对在实际项目中如何完成它感到好奇(例如Berkeley DB)。显然我对广泛的兴趣很感兴趣。我希望得到一个想法,所以当我深入研究数据库书籍的B-Tree部分(或多年前从CS XYZ慢慢记忆我)时,我有一些背景知识。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可能需要查看SQLitecode base比伯克利数据库小得多,它是公共领域,它的组织和评论非常清晰,out-of-source documentation非常出色。在现实世界中教我很多关于btree的文章

答案 2 :(得分:1)

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

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

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