【问题标题】:compare B+tree implementation: storing internal nodes on disk比较 B+tree 实现:将内部节点存储在磁盘上
【发布时间】:2016-03-13 00:54:42
【问题描述】:
是否有任何实现将 B+tree 的内部节点也存储在磁盘上?我只是想知道是否有人知道这样的实现或看到这样做的真正优势?通常,叶子节点存储在磁盘上,根据需要开发B+树。
但也可以保存 B+tree 内部节点的当前状态(通过将指针替换为它指向的磁盘块号):我看到还有其他挑战,比如保持内存中的内部节点与磁盘块:但是 B+ 树可以在 nvram 上实现,或者说是电池支持的 dram 或其他一些方法来保持同步。
只是想知道是否有人已经以这种方式实现了它,例如 linux 的 bcache 或其他实现方式?
干杯,cforfun!
【问题讨论】:
标签:
data-structures
filesystems
b-tree
bcache
【解决方案1】:
我见过的所有持久 B+Tree 实现——与纯粹的“瞬态”内存结构相反——都将两种节点类型都存储在磁盘上。
不这样做将需要在每次加载时扫描所有数据(外部节点,也称为“序列集”)以重建索引,这只有在处理少量数据时才可行或非常特殊的情况。
我见过仅在页面管理器弹出脏页和程序关闭时同步磁盘映像的单用户实现,这会导致经常使用的内部节点(很少被替换/弹出)可以运行很长一段时间没有同步到磁盘。这在某种程度上是合理的,因为内部(“索引”)节点可以在崩溃后重建,因此只有外部(“数据”)节点需要完全容错持久性处理。这种方案的优点是它们消除了靠近根节点且更新频率相当高的节点的浪费写入。以 SSD 为例。
提高持久内存结构的磁盘效率的一种方法是仅将日志持久化到磁盘,并在每次重新启动时根据日志重建整个树。一个非常成功的 Java 包利用这种方法获得了很大的优势。