C/C++:如何在B树中的文件中存储数据

use*_*405 7 c c++ b-tree file

在我看来,将数据作为文件存储在B树中的一种方法可以使用带有结构序列(数组)的二进制文件来有效地完成,每个结构代表一个节点.因此,可以使用与使用数组创建链接列表类似的方法来连接各个节点.但后来支持的问题是删除一个节点,因为在一个巨大的文件中只删除中间的几个字节是不可能的.

一种删除方法可以是跟踪"空"节点,直到达到阈值截止,然后制作另一个将丢弃空节点的文件.但这很乏味.

从简单/效率的角度来看,是否有更好的方法来删除,甚至在文件中表示B树?

TIA,-Sviiya

Tho*_*ews 5

为了在文件中实现 B 树,您可以使用文件偏移量而不是指针。此外,您可以实现“文件内存管理器”,以便您可以重新使用文件中已删除的项目。

为了完全恢复 B 树文件中已删除的块,您必须在新文件中重新创建 B 树。还要记住,大多数操作系统没有截断文件的方法。截断文件的一种可移植方法是写入一个新文件并销毁旧文件。

另一个建议是将文件分区为 B-Tree 分区和数据(项目)分区。B-Tree 分区将包含页面。叶页将包含数据项的偏移量。数据分区将是文件中包含数据项的部分。您最终可能会为每个分区创建多个分区,并且这些分区可能是交错的。

我花了很多时间玩基于文件的 B 树,直到我放弃并决定让数据库程序(或服务器)为我处理数据。

  • 大多数操作系统*确实*具有截断文件的功能。在 Linux、BSD、Windows 中,您可以将文件长度设置为您喜欢的任何值。 (2认同)

小智 3

我做了一个非常快速的搜索并挖出了这个: http: //people.csail.mit.edu/jaffer/WB C 来源:http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ -它似乎提供基于磁盘的 B 树样式数据库 - 尽管看一下“delete.c”,它似乎暗示如果你删除一个节点,那么它下面的所有内容都会被删除 - 如果这是正确的行为,那么听起来就像有什么可能有帮助的吗?

另外 - B 树经常在文件系统中使用 - 你能不看看一些文件系统代码吗?

我自己的倾向是文件系统 - 如果你有一个固定大小的 B 树,每当你“删除”一个节点而不是尝试删除引用时,只需将值设置为在代码中没有任何意义的值。然后,运行一个清理线程,检查是否有人打开该文件进行读取,以及是否一切正常都会阻止该文件并进行清理。