Я загружаю R-дерево с помощью библиотеки spatialindex (http://libspatialindex.github.com/):
string baseName = "streets";
size_t capacity = 10 * 1024 * 1024;
bool bWriteThrough = false;
indexIdentifier = 0;
IStorageManager *disk = StorageManager::createNewDiskStorageManager(baseName, 512);
fileInMem = StorageManager
::createNewRandomEvictionsBuffer(*disk, capacity, bWriteThrough);
// bulkLoads my tree
bulkLoadRTree();
cout << "tree info:" << endl;
cout << *tree << endl;
delete disk;
Следующее выводится в информации о построенном дереве:
Dimension: 2
Fill factor: 0.7
Index capacity: 100
Leaf capacity: 100
Tight MBRs: enabled
Near minimum overlap factor: 32
Reinsert factor: 0.3
Split distribution factor: 0.4
Utilization: 69%
Reads: 1
Writes: 35980
Hits: 0
Misses: 0
Tree height: 4
Number of data: 2482376
Number of nodes: 35979
Level 0 pages: 35463
Level 1 pages: 507
Level 2 pages: 8
Level 3 pages: 1
Splits: 0
Adjustments: 0
Query results: 0
Теперь я пытаюсь загрузить то, что я сохранил на диске:
IStorageManager *ldisk = StorageManager::loadDiskStorageManager(baseName);
SpatialIndex::StorageManager::IBuffer* fileLoadBuffer = StorageManager
::createNewRandomEvictionsBuffer(*ldisk, capacity, bWriteThrough);
id_type id = 1;
tree = RTree::loadRTree(*fileLoadBuffer, id);
cout << *tree << endl;
и дерево имеет только один узел (вывод дерева 🙂
Dimension: 2
Fill factor: 0.7
Index capacity: 100
Leaf capacity: 100
Tight MBRs: enabled
Near minimum overlap factor: 32
Reinsert factor: 0.3
Split distribution factor: 0.4
Utilization: 0%
Reads: 0
Writes: 0
Hits: 0
Misses: 0
Tree height: 1
Number of data: 0
Number of nodes: 1
Level 0 pages: 1
Splits: 0
Adjustments: 0
Query results: 0
Что я делаю не так? Почему я не загружаю все дерево с диска?
Возможно, вы не синхронизировать ваши изменения на диске?
Плюс, обычно можно реализовать дерево на диске, и не полностью прочитайте его при первом доступе. Таким образом, на данный момент, он не может сообщить точную статистику.
Или, может быть, ваш bulkLoadRTree
не использует fileInMem
,
Необходимо удалить fileInMem, чтобы страницы затем отправлялись обратно на диск и далее отправлялись на удаление * диска. Эта строка должна быть добавлена перед удалением диска:
delete fileInMem