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

C++ 正在寻找基于磁盘的B+;C+中的树实现+;或C,c++,c,data-structures,b-tree,C++,C,Data Structures,B Tree,我正在寻找一个轻量级的开源分页B+树实现,它使用磁盘文件来存储树 到目前为止,我只找到了,或者说它依赖于QT(?!),甚至没有编译 现代C++是首选,但C也可以。 我宁愿避免使用完全可嵌入的DBMS解决方案,因为:1)为了满足我的需要,可以使用尽可能简单的磁盘文件组织的基本索引就足够了,不需要并发性、原子性和其他一切。2) 我用它来创建我自己的索引原型,很可能会改变一些算法和存储布局。我想用最少的努力来做到这一点。这不是生产代码。我很确定这不是您正在寻找的解决方案,但为什么您不自己将树存储在一个

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

到目前为止,我只找到了,或者说它依赖于QT(?!),甚至没有编译

现代C++是首选,但C也可以。


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

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

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


您还可以考虑从开源嵌入式数据库中重新使用B-Tead实现。(,等)

Faircom的C-Tree Plus已经上市20多年了。不要为他们工作等等


还有一个是Oracle购买的,但仍然是免费的。

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

我支持伯克利DB的建议。我在被甲骨文收购之前就用过了。它不是一个完整的关系数据库,只是存储键值对。在编写了自己的分页B树实现之后,我们转向了这一点。这是一次很好的学习体验,但我们一直在添加功能,直到is只是BDB的一个(糟糕的)实现版本


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

我自己的实现是在Apache许可下实现的。它基于磁盘,映射到共享内存,在共享内存中它还可以执行锁定(即多用户),文件格式防止崩溃等。所有这些都可以轻松关闭(编译或运行时,如果您喜欢)。所以裸骨几乎是ANSI-C,基本上是缓存在自己的内存中,根本不锁定。包括测试程序。目前,它只处理固定大小的字段,但我正在研究…

RogueWave,一家软件公司,在他们的Tools++产品中有一个很好的BTreeOnDisk实现。我从90年代末开始使用它。它的好处是可以在一个文件中包含多个树。但你确实需要商业许可证

在他们的代码中,他们确实引用了一本名叫“Ammeraal”的书(参见,Ammeraal,L.(1996)C++中的算法和数据结构)。他似乎在磁盘上安装了一个BTree,源代码似乎可以在线访问。不过我从来没用过


我目前正在从事一些项目,我想为这些项目分发源代码,因此我需要找到一个开源的Rogue Wave类的替代品。不幸的是,我不想依赖于GPL类型的许可证,否则一个解决方案就是简单地使用“libdb”或等效物。我需要一个BSD类型的许可证,很长一段时间我找不到任何合适的。但我会看看前面文章中的一些链接。

我不想在内存中构建树,然后将其序列化。我希望在磁盘上构建树,在任何给定时间内存中都只有它的一个子集节点。那么,您希望对B树进行分页。也许你可以在你的问题中澄清这一点?这是我第一次听说它被认为是“分页”树,但你看,它不是分页树。您拥有的是一个数据结构,您希望处理内存中的一个子集,但将整个结构存储在硬盘上。加载大于内存的数据子集称为分页。@kastauyra只需要B-树实现,而不是整个DBMS,但上次我研究它时,从整个DBMS中删除索引是非常混乱的,只是依赖项太多。那么,从上述数据库中可以轻松获得什么B-树实现呢?我一直在积极地寻找,但没有找到。@Joe Soul bringer For SQLite,请查看btree.h中的接口及其在btree.c中的实现。@JoeSoul bringer您是否找到了上述要求的任何B+树实现?您是否找到了任何实现。因为我和你有同样的需求。此外,由于依赖关系,我无法使用现有的DBMS解决方案。@JannatArora,我最终在磁盘I/O例程顶部编写了自己的(不完整;仅限插入和查询)B+树