比较B +树实现:在磁盘上存储内部节点

时间:2016-03-13 00:54:42

标签: data-structures filesystems b-tree bcache

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

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

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

欢呼,cforfun!

1 个答案:

答案 0 :(得分:0)

我见过的所有持久的B + Tree实现 - 而不是纯粹的'瞬态'内存中结构 - 将两种节点类型存储在磁盘上。

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

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

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

相关问题