在 C++ 或 C 中寻找基于磁盘的 B+ 树实现 [关闭]
Posted
技术标签:
【中文标题】在 C++ 或 C 中寻找基于磁盘的 B+ 树实现 [关闭]【英文标题】:Looking for a disk-based B+ tree implementation in C++ or C [closed] 【发布时间】:2010-12-15 19:09:32 【问题描述】:我正在寻找一个轻量级的开源分页 B+ 树实现,它使用磁盘文件来存储树。
到目前为止,我发现只有 memory-based implementations 或 something 依赖于 QT (?!),甚至无法编译。
现代 C++ 是首选,但 C 也可以。
我更喜欢避免完全嵌入的 DBMS 解决方案,因为:1)对于我的需要,可以使用最简单的磁盘文件组织的裸骨索引就足够了,不需要并发性、原子性和其他一切。 2)我正在使用它来原型化我自己的索引,并且很可能会改变一些算法和存储布局。我想用最少的努力做到这一点。它不会是生产代码。
【问题讨论】:
你有没有找到任何实现。因为我和你有同样的需求。由于依赖关系,我也不能使用现有的 DBMS 解决方案。 @JannatArora,我最终在libspatialindex.github.com 磁盘 I/O 例程的顶部编写了自己的(不完整;仅插入和查询)B+-tree 【参考方案1】:http://people.csail.mit.edu/jaffer/WB.
您还可以考虑重新使用开源可嵌入数据库中的 B-Tree 实现。 (BDB、SQLite 等)
【讨论】:
@kastauyra 只采用 B-Tree 实现,而不是整个 DBMS 有可能,但是上次我研究了一下,从整个DBMS中撕掉索引很麻烦,依赖太多了。 那么哪些 B-tree 实现很容易从所述数据库中获取?我一直在积极寻找并发现 none。 @Joe Soul-bringer 对于 SQLite,请查看 btree.h 中的接口及其在 btree.c 中的实现。 @JoeSoul-bringer 你有没有找到满足上述要求的任何 B+ 树实现【参考方案2】:我自己的实现在http://www.die-schoens.de/prg 许可下是 Apache。它基于磁盘,映射到共享内存,它还可以在其中进行锁定(即多用户),文件格式可以防止崩溃等。以上所有内容都可以轻松关闭(如果您愿意,可以编译或运行时)。所以裸露的骨头几乎是ANSI-C,基本上缓存在自己的内存中,根本不加锁。包括测试程序。目前,它只处理固定大小的字段,但我正在努力……
【讨论】:
【参考方案3】:我支持 Berkeley DB 的建议。我在它被甲骨文收购之前使用它。它不是一个完整的关系数据库,只是存储键值对。在编写了自己的分页 B-Tree 实现后,我们切换到了这个。这是一次很好的学习体验,但我们一直在添加功能,直到它只是一个(糟糕)实现的 BDB 版本。
如果您想自己做,这里是我们所做工作的概要。我们使用 mmap 将页面映射到内存中。每个页面的结构都是基于索引的,因此您可以使用页面起始地址访问页面上的任何元素。然后我们根据需要映射和取消映射页面。我们正在索引多 GB 的文本文件,当时 1 GB 的主内存被认为是很多的。
【讨论】:
【参考方案4】:Faircom 的 C-Tree Plus 已上市 20 多年。不要为他们工作等等...FairCom
还有Berkley DB 已被甲骨文收购,但仍可从其网站免费获得。
【讨论】:
【参考方案5】:我很确定这不是您正在寻找的解决方案,但是您为什么不自己将树存储在一个文件中呢?您所需要的只是一种序列化方法和一个 if/ofstream。
基本上你可以像这样序列化它:转到根目录,在文件中写入“0”,像“|”这样的分隔符,根目录中的元素数量,然后是所有根元素。对级别 1 重复“1”,依此类推。只要您不更改级别保持级别索引,空叶子可能看起来像 2|0。
【讨论】:
我不想在内存中构建树然后序列化它。我希望在磁盘上构建树,在任何给定时间在内存中都只有一部分节点。 那么您正在寻找分页 B 树。也许你可以在你的问题中澄清这一点? 这是我第一次听说它被认为是“分页”树,但是你去吧。 不是分页树。你所拥有的是一个数据结构,你想处理内存中的一个子集,但将整个结构存储在硬盘上。加载大于内存的数据子集称为分页。【参考方案6】:您可以查看 Berkeley DB,它支持 ny Oracle,但它是开源的,可以在 here 找到。
【讨论】:
【参考方案7】:软件公司 RogueWave 很好地实现了 BTreeOnDisk,作为其 Tools++ 产品的一部分。我从 90 年代后期开始使用它。它的好处是您可以在一个文件中包含多个树。但您确实需要商业许可证。
在他们的代码中,他们确实引用了一个名为“Ammeraal”的人的书(参见 http://home.planet.nl/~ammeraal/algds.html , Ammeraal, L. (1996) Algorithms and Data Structures in C++)。他似乎在磁盘上有一个 BTree 的实现,源代码似乎可以在线访问。不过我没用过。
我目前从事的项目是我想要分发源代码的项目,因此我需要找到 Rogue Wave 类的开源替代品。不幸的是,我不想依赖 GPL 类型的许可证,否则解决方案就是使用“libdb”或等效的。我需要一个 BSD 类型的许可证,很长一段时间我都找不到合适的。但我会看看之前帖子中的一些链接。
【讨论】:
以上是关于在 C++ 或 C 中寻找基于磁盘的 B+ 树实现 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章