Архитектура файла
Ну, это страницы (= блоки). Страницы должны иметь кратный размер страницы базового хранилища, поэтому, вероятно, 1kb или 8kb блоков. Каждый блок имеет число и может быть ссылкой таким образом.
На страницах каталога хранятся ограничивающие рамки для детей и их номера страниц.
На дочерних страницах хранятся фактические объекты данных.
Управление дереву
Ну, в теории: всякий раз, когда вы изменяете страницу в памяти, записать изменения на диск. Вот и все.
На практике вы можете использовать кеш для повышения производительности, и вы можете иметь транзакции для сохранения вашего дерева в случае сбоя приложения.
Об этих двух предметах вы можете найти много литературы в области архитектуры РСУБД.
Ключевым преимуществом R * -tree является то, что оно является обычным деревом, ориентированным на страницы, так как вы будете иметь их в системах баз данных повсюду. Если у вас есть хорошая реализация на B + -tree на диске, вы можете использовать большую часть своего кода для R * -tree.
Как начать
Для начала, вам нужно привыкнуть к дисковым индексациям данных, как это делается в классической СУБД. Я предлагаю начать с на диске B-tree или B + -tree.Разрешите удаление, потому что вам нужно подумать об управлении удаленными страницами и обо всем этом.
После того, как вы определили B-Tree на диске (и, возможно, потратите некоторое время на его оптимизацию!), Выполнение R-дерева на диске должно быть довольно очевидным.
Я havn't посмотрел на код, но это может быть хорошей отправной точкой: http://www.die-schoens.de/prg/ или некоторые другие, связанные с Looking for a disk-based B+ tree implementation in C++ or C
вы считаете ли использование базы данных? – Philipp
Пару лет назад мы использовали инструменты геопространства Oracle. Но у него было 2 проблемы: 1) это было медленным для нашей рабочей нагрузки, и 2) в какой-то момент нам нужно было искать в наборе геозонов (полигонов), чтобы увидеть, находится ли в них заданная точка или нет. И другая причина заключается в том, что мы планируем отойти от Oracle. В то же время я обрабатываю этот поиск (и нахожу NN, маршруты и т. Д.) Всеми приложениями в памяти, которые я написал сам. Моя новая проблема в том, что я написал ее так, как будто мои исходные данные были прочитаны только для загрузки сбалансированных деревьев в память. Но добавление новых элементов заставляет меня перебалансировать дерево. –
MongoDB довольно хорош в геопространственном индексировании. – Philipp