【问题标题】:Larger than memory data structures and how they are typically handled大于内存数据结构以及它们的典型处理方式
【发布时间】:2010-10-20 08:05:35
【问题描述】:

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

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

【问题讨论】:

    标签: data-structures b-tree


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可能想看看SQLitecode base 比 Berkeley DB 小得多,它是公共领域,组织和评论非常清晰,out-of-source documentation 非常好。教会了我很多关于现实世界中 btree 的知识

      【讨论】:

        【解决方案3】:

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

        即使更新它们也不需要同时在内存中存储大量页面 - 我想最困难的操作是在重组节点时删除,但如果它实施得当,即使相对而言也可以做到内存中的几页。

        【讨论】:

          猜你喜欢
          • 2010-10-05
          • 2017-05-23
          • 2012-11-27
          • 1970-01-01
          • 2021-11-13
          • 2010-12-20
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          相关资源
          最近更新 更多