Chapter 2

File Format

在涵盖 B-Tree 的基本语义后,我们现在已经就绪来探讨 B-Tree 跟其他的一些数据结构是如何基于磁盘实现的。访问磁盘的方式跟访问内存是有巨大差异的: 从一个开发人员的角度,内存访问几乎是透明的,得益于虚拟内存的帮助我们无需手动去管理内存的偏移量。磁盘的访问则是使用系统调用的,我们一般需要明确的提供目标文件的偏移量,然后将磁盘上的数据解释为可以用内存访问的形式。

这意味着需要对这个差异了然于胸才能设计出高效的基于磁盘的数据结构。因此,我们首先从容易构建的文件格式开始,然后再修改、再理解。在本章,我们会讨论通用的原则跟实践方式来帮助我们设计所有的基于磁盘的数据结构,而不仅是 B-Tree。

有许多种可能的方式来实现 B-Tree,这里我们还将讨论几个有用的技术。他们的细节可能在实现中会差异很大,但通用的原则基本是一样的。理解 B-Tree 基础的机制,如分裂跟合并是非常重要的,不过只有他们是不足以来做出真正的实现的。这其中还有许多其他的东西需要整合到一起,才能得到我们最终的结果。

基于磁盘的指针管理跟内存中的指针是有很大的区别的,要常常想着把基于磁盘的 B-Tree 当成管理页的机器:算法需要去组合跟导向页。页跟指向他的指针需要进行计算后才能得到其相应的位置。

因为 B-Tree 中大部分复杂的点都来自于其变异性,我们讨论的具体细节就集中在了 page layouts 页面布局、splitting 分裂、relocations 重分配跟其他一些适用于数据结构可变性的概念。在这之后我们会讨论 LSM Trees,我们会专注于排序跟维护因为他们是 LSM 复杂性的来源。