B-Tree 保存在 File 中的好处是不是就没了?

is not the benefit of B-Tree lost when it is saved in File?

我正在阅读有关 B-Tree 的文章,很有趣地知道它是专门为存储在辅助内存中而构建的。但我对以下几点感到有点困惑:

  1. 如果我们将B-Tree保存在二级内存中(通过Java中的序列化),B-Tree的优势是不是就失去了?因为一旦节点被序列化,我们将无法访问对子节点的引用(因为我们进入主内存)。所以这意味着,我们将不得不一个一个地读取所有节点(因为没有可用于子节点的引用)。如果我们必须读取所有节点,那么树的优势是什么?我的意思是,在那种情况下,我们不会在树上使用二进制搜索。有什么想法吗 ?

在磁盘上使用B-Tree时,不会从文件中读取、反序列化、修改和序列化,然后写回。

磁盘上的B-Tree是由数据块组成的disk-based数据结构,这些块一次读取和写入一个块。通常:

  • B-Tree中的每个节点都是一个数据块(字节)。块具有固定大小。
  • 如果使用文件,则块按其在文件中的位置寻址,如果 B-Tree 块直接映射到磁盘扇区,则按其扇区地址寻址。
  • 一个"pointer to a child node"只是一个数字,是节点的区块地址。
  • 块很大。通常大到有 1000 children 或更多。那是因为读取一个块是昂贵的,但成本并不取决于块的大小。通过保持块足够大以便整个树中只有 3 或 4 层,我们可以最大限度地减少访问任何特定项目所需的读取或写入次数。
  • 通常使用缓存,以便大多数访问只需要触及磁盘上树的最低级别。

所以要在 B-Tree 中找到一个项目,您需要读取根块(它可能会从缓存中取出),通过它查找合适的 child 块并读取它(可能再次超出缓存),也许再做一次,最后读取适当的叶块并提取数据。