在C ++或C中寻找基于磁盘的B +树实现

时间:2009-11-12 08:25:47

标签: c++ c data-structures b-tree

我正在寻找一个轻量级的开源分页B +树实现,它使用磁盘文件来存储树。

到目前为止,我发现只有memory-based implementationssomething依赖于QT(?!),甚至没有编译。

现代C ++是首选,但C也会这样做。

我更愿意避免使用完全可嵌入的DBMS解决方案,因为:1)对于我的需求裸骨索引,可以使用最简单的磁盘文件组织就足够了,不需要并发性,原子性和其他一切。 2)我使用它来构建我自己的索引,并且很可能会改变一些算法和存储布局。我想以最少的努力做到这一点。它不会是生产代码。

7 个答案:

答案 0 :(得分:9)

http://people.csail.mit.edu/jaffer/WB

您还可以考虑从开源可嵌入数据库中重用B-Tree实现。 (BDBSQLite等)

答案 1 :(得分:3)

Faircom的C-Tree Plus已在商业上销售超过20年。不要为他们工作等... FairCom

还有Berkley DB由甲骨文购买,但仍然可以从他们的网站免费获得。

答案 2 :(得分:3)

我自己的实现是在http://www.die-schoens.de/prg许可是Apache。它基于磁盘,映射到共享内存,它也可以锁定(即多用户),文件格式防止崩溃等。如果您愿意,可以轻松关闭所有上述内容(编译或运行时)。所以裸骨几乎是ANSI-C,基本上是在自己的内存中缓存而根本没有锁定。测试程序包括在内。目前,它只处理固定大小的字段,但我正在努力......

答案 3 :(得分:2)

我是对Berkeley DB的建议。我在Oracle收购之前使用过它。它不是完整的关系数据库,只是存储键值对。在编写了我们自己的分页B-Tree实现之后,我们切换到了它。这是一个很好的学习经历,但我们一直在添加功能,直到只是一个(很差)实现的BDB版本。

如果你想自己做,这里是我们所做的大纲。我们使用mmap将页面映射到内存中。每个页面的结构都是基于索引的,因此使用页面起始地址可以访问页面上的任何元素。然后我们根据需要映射和取消映射页面。我们正在索引多GB文本文件,当1 GB的主内存被认为是很多时。

答案 4 :(得分:1)

我很确定这不是您正在寻找的解决方案,但为什么不自己将树存储在文件中?您所需要的只是序列化和if / ofstream的方法。

基本上你可以像这样序列化它:转到root,在文件中写'0',像'|'这样的分隔符,root中的元素个数,然后是所有根元素。对级别1重复“1”,依此类推。只要你不改变级别保持级别索引,空叶子看起来就像2 | 0。

答案 5 :(得分:1)

您可以查看Berkeley DB,Oracle支持它,但它是开源的,可以找到here

答案 6 :(得分:1)

软件公司RogueWave将BTreeOnDisk作为其Tools ++产品的一部分进行了很好的实现。我从90年代末就开始使用它了。关于它的好处是你可以在一个文件中有多个树。但你确实需要商业许可证。

在他们的代码中,他们确实提到了一个叫做Ammeraal' (参见http://home.planet.nl/~ammeraal/algds.html,Ammeraal,L。(1996)C ++中的算法和数据结构)。他似乎在磁盘上有一个BTree,并且源代码似乎可以在线访问。我从来没用过它。

我目前正在处理我希望分发源代码的项目,因此我需要找到Rogue Wave类的开源替代品。不幸的是,我不想依赖GPL类型的许可证,否则一个解决方案就是使用&#lib;'或同等学历。我需要一个BSD类型的许可证,很长一段时间我都找不到合适的东西。但我会看一下之前帖子中的一些链接。