Постоянное (на диске) R-Tree (или R* Tree)

Как можно реализовать R* Tree как постоянное (на основе диска)? Какова архитектура файла для сохранения индекса дерева R* или для сохранения конечных значений?

Примечания: Кроме того, как можно выполнять операции вставки, обновления и удаления в таком постоянном дереве R*?

Примечания II: я реализовал R-Tree в памяти с функцией массовой загрузки. Но я думаю, что это совершенно не имеет значения, когда мы говорим о дисковых.


person Kaveh Shahbazian    schedule 28.11.2012    source источник
comment
Вы рассматривали возможность использования базы данных?   -  person Philipp    schedule 28.11.2012
comment
Пару лет назад мы использовали геопространственные инструменты Oracle. Но у него было 2 проблемы: 1) он был медленным для нашей рабочей нагрузки и 2) в какой-то момент нам нужно было искать в наборе геозон (полигонов), чтобы увидеть, находится ли данная точка внутри них или нет. Другая причина в том, что мы планируем уйти от Oracle. Тем временем я обрабатываю этот поиск (и нахожу NN, маршруты и т. д.) с помощью приложения в памяти, которое я написал сам. Моя новая проблема заключается в том, что я написал это так, как если бы мои исходные данные были доступны только для чтения, поэтому я загружаю сбалансированные деревья в память. Но добавление новых элементов вынуждает меня перебалансировать дерево.   -  person Kaveh Shahbazian    schedule 28.11.2012
comment
MongoDB неплохо справляется с геопространственной индексацией.   -  person Philipp    schedule 28.11.2012
comment
Что ж, просто начните и спрашивайте более конкретно, когда вы застряли. Прямо сейчас это не тот вопрос, на который можно ответить.   -  person Has QUIT--Anony-Mousse    schedule 28.11.2012
comment
@ Anony-Mousse Спасибо за комментарий. Я выделил свой главный вопрос из других заметок. Теперь это должно казаться более значимым. Прокомментируйте, пожалуйста; Спасибо.   -  person Kaveh Shahbazian    schedule 28.11.2012
comment
Не совсем. Вопрос по-прежнему заключается в том, с чего мне начать. Где бы вы ни были, просто продолжайте оттуда!   -  person Has QUIT--Anony-Mousse    schedule 28.11.2012


Ответы (3)


Если вам нужен индекс R-Tree на диске, я бы посоветовал использовать Spatialite или Postgis. Spatialite легкий и легко встраивается в отдельное приложение. Кроме того, вы смотрели на Проект C# Spatial Index?. Я написал реализацию R-Tree на Java несколько лет назад и не рекомендовал бы делать это, если что-то уже существует.

person Shawn H    schedule 28.11.2012
comment
По моим временным рамкам для этого SQLite был решением! - person Kaveh Shahbazian; 22.12.2012
comment
пространственный индекс С# - это реализация в памяти. - person citykid; 19.06.2014

Архитектура файла

Ну, это страницы (= блоки). Страницы должны иметь кратный размер страницы базового хранилища, поэтому, вероятно, блоки размером 1 КБ или 8 КБ. Каждый блок имеет номер, и таким образом на него можно ссылаться.

На страницах каталога хранятся ограничивающие рамки дочерних элементов и их номера страниц.

Дочерние страницы хранят фактические объекты данных.

Управление деревом

Ну, в теории: всякий раз, когда вы изменяете страницу в памяти, вы записываете изменения на диск. Вот и все.

На практике вы можете захотеть использовать кеш для повышения производительности и иметь транзакции для сохранения согласованности вашего дерева в случае сбоя приложения.

По обеим этим вещам можно найти много литературы в области архитектуры СУБД.

Ключевым преимуществом R*-дерева является то, что это обычное странично-ориентированное дерево, которое вы могли бы использовать в системах баз данных повсюду. Если у вас есть хорошая реализация B+-дерева на диске, вы можете повторно использовать большую часть своего кода для R*-дерева.

С чего начать

Для начала вам нужно привыкнуть к индексации данных на диске, как это делается в классической СУБД. Я предлагаю начать с на диске B-дерева или B+-дерева. Разрешайте удаления, потому что вам нужно подумать об управлении удаленными страницами и всем этом.

Как только вы разберетесь с B-деревом на диске (и, возможно, потратите некоторое время на его оптимизацию!), создание R-дерева на диске должно быть довольно очевидным.

Я не смотрел код, но это может быть хорошей отправной точкой: http://www.die-schoens.de/prg/ или некоторые другие ссылки в Ищу реализацию дерева B+ на основе диска на C++ или C

person Has QUIT--Anony-Mousse    schedule 02.12.2012
comment
Спасибо за Ваш ответ. Но теперь я совсем потерялся! Есть ли пошаговая ссылка для понимания того, как это сделать на самом деле? Я скачал и прочитал множество реализаций R(*) Tree на Java и некоторые на C и C++, но не понял ни строчки! Я уверен, что придерживаюсь очень неправильного мнения (и никогда раньше не делал ничего подобного). - person Kaveh Shahbazian; 02.12.2012
comment
Существует более чем один путь к этому. И это не так просто. Вам нужно управлять пустыми страницами, которые вы получите, например, после удаления. Возможно, вам стоит начать с реализации B+-дерева на диске. Не начинайте с реализации в памяти. Работайте над диском с самого начала. - person Has QUIT--Anony-Mousse; 02.12.2012
comment
К сожалению, я начал с R-дерева в памяти, которое мне очень нравится: построено путем массовой вставки очень быстро (12 секунд на моей машине для 2100000 записей) и молниеносной скоростью поиска (менее 1 микросекунды), и я использую это в производстве. . Может быть, это полностью сгнило мне, потому что я вообще не понимаю эти коды! Я сделал то, что вы сказали раньше, и начал с B-Tree, но это тоже не помогло! Я не могу выделить идею STORAGE из остального кода :( - person Kaveh Shahbazian; 02.12.2012
comment
Извините, но управление хранилищем — это очень скучный и утомительный код. Нет однострочника, который просто поместит его на диск. Вы должны столкнуться с этой реальностью и начать работать с низкоуровневым доступом к диску. - person Has QUIT--Anony-Mousse; 02.12.2012

Если у вас уже есть реализация основной памяти, вы можете повторно использовать тот же код, просто добавив записи на диск. Вы должны учитывать размер страницы и оптимизировать узлы дерева, чтобы они поместились на странице (вы можете прочитать ее за один раз).

Было бы лучше (с точки зрения производительности) иметь моментальные снимки дерева основной памяти, хранящиеся на диске (моментальные снимки можно делать, когда дерево не находится под высоким давлением), а не записывать каждое изменение на диск.

В вопросе вы указываете, что запрос к дереву имеет более важное значение, поэтому вам лучше использовать R *-дерево, поскольку оно сводит к минимуму перекрытие между узлами дерева. Однако, если ваши требования будут сосредоточены на операциях обновления (вставка/удаление), я бы посоветовал взглянуть на Поддержка частых обновлений R-деревьев: восходящий подход.

person Robertas    schedule 28.11.2012
comment
Мне нужна хорошая производительность при чтении. Данные не сильно изменятся, но когда это произойдет, мне нужно быстро сбалансировать дерево. В настоящее время я строю дерево, используя все свои данные (не вставляя узлы). - person Kaveh Shahbazian; 28.11.2012