B-Tree如何在序列化方面发挥作用?

时间:2013-04-02 14:34:01

标签: java database serialization data-structures b-tree

在Java中,我知道如果你要在硬盘上构建B-Tree索引,你可能应该使用序列化,因为B-Tree结构必须从RAM写入HD。我的问题是,如果以后我想查询索引中的键的值,是否可以将B-Tree的一部分反序列化回RAM?理想情况下,仅检索特定键的值。将整个索引提取到RAM是一个糟糕的设计,至少在B-Tree大于RAM大小的情况下。

如果可以的话,如果有人提供了一些代码,那就太棒了。 DBMS如何在Java或C中执行此操作?

提前致谢。

3 个答案:

答案 0 :(得分:3)

  

你可能应该使用序列化,因为B-Tree结构必须从RAM写入HD

绝对不是。序列化是实现基于磁盘的B树时使用的最后一种技术。您必须能够将单个节点读入内存,添加/删除键,更改指针等,然后将它们放回原处。您还希望该文件可被其他语言读取。您应该定义B树节点的与语言无关的表示。这并不困难。除了RandomAccessFile提供的内容之外,您不需要任何其他内容。

答案 1 :(得分:2)

您通常将B树分成几个“页面”,每个页面都有一些键值对等。然后您只需要一次将一个页面加载到内存中。

答案 2 :(得分:1)

关于rdbms如何做的灵感,检查嵌入式Java数据库的源代码可能是个好主意:Derby,HyperSql,H2,......

如果这些数据库解决了您的问题,我宁愿忘记实施索引并立即使用他们的产品。因为它们是嵌入式的,所以不需要设置服务器。 - rdbms代码是应用程序类路径的一部分 - 内存占用空间很小。

如果你当然有可能......


如果树很容易融入记忆中,我强烈建议将树保留在那里。性能的差异将是巨大的。更不用说在磁盘上保持同步更改的困难,重新组织等......

在某些时候您需要存储它,请检查Externalizable而不是常规序列化。众所周知,序列化是缓慢而广泛的。 Externalizable允许您控制写入磁盘的每个字节。更不用说将索引读回内存时的性能差异。

如果树太大而无法放入内存,则必须使用RandomAccessFile进行某种内存缓存。尽管如此,经常访问的项目仍会从内存中消失。但是,您需要考虑索引的更新。你必须在某些时候将它们刷新到磁盘上。

所以,个人,我宁愿从头开始这样做。而是使用那里的代码。 : - )