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

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

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

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

TIA,-Sviiya

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

另外 – B树通常用在文件系统中 – 你能不看一些文件系统代码?

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

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

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

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

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

您也可以使用Berkley DB。 它适用于C程序并实现B +树。