1

是否有任何实现将 B+tree 的内部节点也存储在磁盘上?我只是想知道是否有人知道这样的实现或看到这样做的真正优势?通常,将叶子节点存储在磁盘上并根据需要开发 B+ 树。

但是也可以保存 B+tree 内部节点的当前状态(通过用它指向的磁盘块号替换指针):我看到还有其他挑战,比如保持内存中的内部节点与磁盘块同步:但是 B+ 树可以在 nvram 上实现,或者说是电池支持的 dram 或其他一些方法来保持同步。

只是想知道是否有人已经像 linux 的 bcache 或其他实现那样实现了它?

干杯,cforfun!

4

1 回答 1

1

我见过的所有持久 B+Tree 实现——与纯粹的“瞬态”内存结构相反——都将两种节点类型都存储在磁盘上。

不这样做将需要在每次加载时扫描所有数据(外部节点,又称“序列集”)以重建索引,这只有在处理少量数据或非常特殊时才可行情况。

我见过单用户实现仅在页面管理器弹出脏页和程序关闭时同步磁盘映像,这会导致经常使用的内部节点 - 很少被替换/弹出 - 可以在没有同步的情况下运行 -到磁盘很长时间。这在某种程度上是合理的,因为内部(“索引”)节点可以在崩溃后重建,因此只有外部(“数据”)节点需要完全容错持久性处理。这种方案的优点是它们消除了靠近根节点且更新频率相当高的节点的浪费写入。例如,想想 SSD。

提高持久内存结构的磁盘效率的一种方法是仅将日志持久化到磁盘,并在每次重新启动时从日志中重建整个树。一个非常成功的 Java 包使用这种方法获得了很大的优势。

于 2016-03-13T08:03:15.167 回答