C/C++:如何将数据存储在 B 树中的文件中
Posted
技术标签:
【中文标题】C/C++:如何将数据存储在 B 树中的文件中【英文标题】:C/C++: How to store data in a file in B tree 【发布时间】:2011-01-12 07:26:55 【问题描述】:在我看来,将数据作为文件存储在 B 树中的一种方法可以使用 C 使用具有结构序列(数组)的二进制文件有效地完成,每个结构代表一个节点。因此,可以使用类似于使用数组创建链表的方法连接各个节点。但是接下来 props up 的问题是删除一个节点,因为在一个巨大的文件中只擦除中间的几个字节是不可能的。
删除的一种方法可能是跟踪“空”节点,直到达到阈值截止,然后制作另一个将丢弃空节点的文件。但这很乏味。
从简单性/效率的角度来看,是否有更好的方法来删除,甚至在文件中表示 B 树?
TIA, -斯维亚
【问题讨论】:
澄清一下,你问的是 B 树还是二叉树。 B 树。但我想为了存储为文件的目的,问题会是一样的吗? 顺便说一句,C 和 C++ 是两种不同的语言。如果您正在编写适用于两者的代码,请添加 C++ 标记。 【参考方案1】:为了在文件中实现 B 树,您可以使用文件偏移量而不是指针。此外,您可以实现“文件内存管理器”,以便您可以重新使用文件中已删除的项目。
为了完全恢复 B-Tree 文件中已删除的块,您必须在新文件中重新创建 B-Tree。还要记住大多数操作系统没有截断文件的方法。一种截断文件的可移植方法是写入一个新文件并销毁旧文件。
另一个建议是将文件分区为 B-Tree 分区和数据(项目)分区。 B-Tree 分区将包含页面。叶页将包含数据项的偏移量。数据分区将是文件中包含数据项的部分。您最终可能会创建多个分区,并且这些分区可能是交错的。
我花了很多时间玩基于文件的 B-Tree,直到我放弃并决定让数据库程序(或服务器)为我处理数据。
【讨论】:
听起来很有趣。我的这个练习是为了接触低级编码。我主要对基于 Linux 的系统感兴趣,它支持文件截断。 :) 大多数操作系统的 do 都有截断文件的功能。在 Linux、BSD、Windows 中,您可以将文件长度设置为您喜欢的任何值。【参考方案2】:我快速搜索并找到了这个:http://people.csail.mit.edu/jaffer/WB C 源:http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ - 它似乎提供了基于磁盘的 B 树样式数据库 - 尽管查看“delete.c”它似乎暗示如果你删除一个节点,它下面的所有东西都会被删除 - 如果这是正确的行为,那么它听起来可能会有所帮助?
另外——B-trees 经常用在文件系统中——你能不看看一些文件系统代码吗?
我自己的倾向是文件系统——如果你有一个固定大小的 B-tree,每当你“删除”一个节点而不是试图删除引用时,只需将值设置为任何在你的代码。然后,运行一个清理线程来检查是否有人打开了文件以供阅读,以及是否所有人都安静地阻塞了文件并进行了整理。
【讨论】:
感谢您的参考,九指。 :) 肯定要读它。因为删除可能很频繁,所以对它们进行核算应该是有效的。我预计其中一些操作可能会延迟,但我需要阅读代码以查看是否有更好的选择。我还打算稍后将它用于文件系统,但是由于大小是恒定的,因此实现会有所不同。所以设计需要考虑到这一点。 嗯,我同意。该代码声称可以满足您的需要,粗略地看一下 viewcvs 就表明它可能 - 无需坐下来重新构建您的问题,尽管很难说...我认为文件系统只做他们希望删除的“零”元素并将其分配给任何零元素,但我可能错了。无论哪种方式,如果这不能回答它,请再次打开问题! 这些问题确实回答了我正在寻找的内容,并且我已经发现了文件截断,因此从中间删除数据的问题被规避了。谢谢。 :)【参考方案3】:您也可以使用 Berkley DB。它适用于 C 程序并实现 B+ 树。
【讨论】:
是的,但我想编写自己的代码来获得真实的感觉。 :) 同意。自己写可以得到真实的感觉。 BBD 是非常复杂的数据库,并提供了许多普通代码无法提供的功能。如果实际产品部署,我会选择BDB。在这里重新发明***很困难。以上是关于C/C++:如何将数据存储在 B 树中的文件中的主要内容,如果未能解决你的问题,请参考以下文章