Ищу реализацию дерева B+ на диске в C++ или C

Я ищу облегченную реализацию дерева подкачки B+ с открытым исходным кодом, которая использует файл на диске для хранения дерева.

Пока я нашел только реализации на основе памяти или что-то, зависящее от QT (?!) и даже не компилируемое.

Современный C++ предпочтительнее, но C тоже подойдет.

Я предпочитаю избегать полностью встраиваемых СУБД, потому что: 1) для моих нужд достаточно голого индекса, который может использовать максимально простую дисковую файловую организацию, нет необходимости в параллелизме, атомарности и всем остальном. 2) Я использую это для прототипирования своего собственного индекса и, скорее всего, изменю некоторые алгоритмы и схему хранения. Я хочу сделать это с минимальными усилиями. Это не будет производственный код.


person Laurynas Biveinis    schedule 12.11.2009    source источник
comment
Вы нашли какую-нибудь реализацию. Потому что у меня такие же потребности, как у тебя. Также я не могу использовать существующие решения СУБД из-за зависимостей.   -  person Jannat Arora    schedule 17.02.2013
comment
@JannatArora, в итоге я написал свое собственное (неполное; только вставки и запросы) B+-дерево в верхней части libspatialindex.github .com подпрограммы дискового ввода-вывода   -  person Laurynas Biveinis    schedule 17.02.2013


Ответы (7)


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

Вы также можете рассмотреть возможность повторного использования реализаций B-Tree из встраиваемой базы данных с открытым исходным кодом. (BDB, SQLite и т. д.)

person Vijay Mathew    schedule 12.11.2009
comment
@kastauyra Просто возьмите реализацию B-Tree, а не всю СУБД - person Vijay Mathew; 12.11.2009
comment
Возможно, но в прошлый раз, когда я изучал это, было довольно грязно вырывать индекс из всей СУБД, слишком много зависимостей. - person Laurynas Biveinis; 12.11.2009
comment
Итак, какие реализации B-tree можно легко взять из указанных баз данных? Я активно искал и не нашел ничего. - person Joe Soul-bringer; 13.12.2009
comment
@Joe Soul-bringer Для SQLite посмотрите на интерфейс в btree.h и его реализацию в btree.c. - person Vijay Mathew; 14.12.2009
comment
@JoeSoul-bringer Нашли ли вы какие-либо реализации дерева B+ для вышеуказанных требований? - person Jannat Arora; 17.02.2013

Моя собственная реализация находится под http://www.die-schoens.de/prg. Лицензия Apache. . Он основан на диске, сопоставляется с общей памятью, где он также может выполнять блокировку (т. Е. Многопользовательский), формат файла защищает от сбоев и т. Д. Все вышеперечисленное можно легко отключить (компилировать или запускать, если хотите). Таким образом, голая кость будет почти ANSI-C, в основном кэшируется в собственной памяти и вообще не блокируется. Тестовая программа включена. В настоящее время он имеет дело только с полями фиксированного размера, но я работаю над этим...

person Joerg Schoen    schedule 05.06.2011

Я поддерживаю предложение для Berkeley DB. Я использовал его до того, как его купил Oracle. Это не полноценная реляционная база данных, она просто хранит пары ключ-значение. Мы перешли на это после того, как написали собственную реализацию B-Tree подкачки. Это был хороший опыт обучения, но мы продолжали добавлять функции, пока не превратились в (плохо) реализованную версию BDB.

Если вы хотите сделать это самостоятельно, вот схема того, что мы сделали. Мы использовали mmap для отображения страниц в памяти. Структура каждой страницы была основана на индексе, поэтому с начальным адресом страницы вы могли получить доступ к любому элементу на странице. Затем мы сопоставили и удалили страницы по мере необходимости. Мы индексировали текстовые файлы размером в несколько ГБ, когда 1 ГБ основной памяти считался большим.

person KeithB    schedule 12.11.2009

C-Tree Plus от Faircom доступен на рынке уже более 20 лет. Не работайте на них и т. д. FairCom

Существует также Berkley DB, которая была куплена Oracle, но по-прежнему бесплатна на их сайте.

person AnthonyLambert    schedule 12.11.2009

Я почти уверен, что это не то решение, которое вы ищете, но почему бы вам не сохранить дерево в файле самостоятельно? Все, что вам нужно, это подход к сериализации и if/ofstream.

По сути, вы можете сериализовать это так: перейдите в корень, напишите «0» в своем файле, разделитель, например «|», количество элементов в корне, а затем все корневые элементы. Повторите с «1» для уровня 1 и так далее. Пока вы не измените уровень, сохраните индекс уровня, пустые листья могут выглядеть как 2|0.

person DaClown    schedule 12.11.2009
comment
Я не собираюсь строить дерево в памяти, а затем сериализовать его. Я хочу построить дерево на диске, имея в памяти только подмножество его узлов в любой момент времени. - person Laurynas Biveinis; 12.11.2009
comment
Тогда вы ищете пейджинговое B-дерево. Может быть, вы могли бы уточнить это в своем вопросе? - person DaClown; 12.11.2009
comment
Я впервые слышу, что это считается деревом подкачки, но вот. - person Laurynas Biveinis; 12.11.2009
comment
Это не дерево подкачки. У вас есть структура данных, подмножество которой вы хотите обрабатывать в памяти, но вся структура хранится на жестком диске. Загрузка подмножеств данных, объем которых превышает размер вашей памяти, называется пейджингом. - person DaClown; 12.11.2009

Вы можете посмотреть на Berkeley DB, он поддерживается ny Oracle, но это открытый исходный код, и его можно найти здесь.

person Jackson    schedule 12.11.2009

RogueWave, компания-разработчик программного обеспечения, имеет хорошую реализацию BTreeOnDisk как часть своего продукта Tools++. Пользуюсь с конца 90-х. Хорошая вещь в том, что вы можете иметь несколько деревьев в одном файле. Но вам нужна коммерческая лицензия.

В своем коде они ссылаются на книгу парня по имени Аммераал (см. http://home.planet.nl/~ammeraal/algds.html , Ammeraal, L. (1996) Алгоритмы и структуры данных в C++). Кажется, у него есть реализация BTree на диске, а исходный код доступен в Интернете. Я никогда не использовал его, хотя.

В настоящее время я работаю над проектами, для которых я хотел бы распространять исходный код, поэтому мне нужно найти замену классам Rogue Wave с открытым исходным кодом. К сожалению, я не хочу полагаться на лицензии типа GPL, иначе решением было бы просто использовать «libdb» или эквивалент. Мне нужна лицензия типа BSD, и я долго не мог найти ничего подходящего. Но я посмотрю на некоторые ссылки в предыдущих сообщениях.

person Peter Ritter    schedule 15.08.2014