Я создал индекс R * основной памяти с помощью библиотеки spatialindex следующим образом (DBStream реализует интерфейс для bulkLoading)
// creating a main memory RTree
memStorage = StorageManager::createNewMemoryStorageManager();
size_t capacity = 1024;
bool bWriteThrough = false;
fileInMem = StorageManager
::createNewRandomEvictionsBuffer(*memStorage, capacity, bWriteThrough);
DBStream dstream(streets);
tree = RTree::createAndBulkLoadNewRTree(SpatialIndex::RTree::BLM_STR, dstream,
*fileInMem,
fillFactor, indexCapacity,
leafCapacity, dimension, rv, indexIdentifier);
Мои данные доступны только для чтения, то есть я хочу построить дерево только один раз, сохранить его и перезагружать из постоянного хранилища каждый раз, когда я использую свою программу. Ясно, что я могу сохранять и загружать memStorage сам, но как воссоздать RTree из него?
Так как вы все равно загружаете дерево, на самом деле здесь мало что можно получить. Все, что делает массовая загрузка STR, это сортирует данные. Это O(n log n)
теоретически, но если у вас есть данные, отсортированные надлежащим образом, это будет на самом деле в O(n)
с большинством реализаций сортировки.
Так что, скорее всего, сериализация дерева в файл и обратно не намного дешевле, чем его повторная массовая загрузка каждый раз. Это отнимает некоторую гибкость, хотя.
R-деревья вообще предназначены для динамических данных ИМХО. Конечно, они работают для статических данных. Но их главная сила (в отличие от других структур) заключается в том, что дерево поддерживает балансировку при вставке.
После обширных исследований я должен сделать вывод, что можно сохранить объект MainMemoryStorage, но его невозможно загрузить. Сохранение объекта возможно через производный класс, который отслеживает все используемые идентификаторы страниц (и затем сохраняет их в файл). Загрузка этих страниц очень проблематична, так как нужен прямой доступ к
std::vector<Entry*> m_buffer;
std::stack<id_type> m_emptyPages;
из MemoryStorageManager.h. Эти парни являются частными, и MemoryStorageManager.h недоступен, так как это частное включение, доступное только для spatiallibrary.
Какой удручающий ответ.