0

我通过以下方式在空间索引库的帮助下创建了一个主内存 R* 索引(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?

4

2 回答 2

1

由于无论如何您都在批量加载树,实际上这里几乎没有什么收获。STR 批量加载所做的只是对数据进行排序。这是O(n log n)理论上的,但是如果您对数据进行了适当的排序,那么它实际上将适用于O(n)大多数排序实现。

因此,最有可能的是,将树序列化为一个文件并返回并不比每次再次批量加载它便宜多少。不过,它确实带走了一些灵活性。

R-Trees 通常用于动态数据恕我直言。当然,它们确实适用于静态数据。但它们的关键优势(与其他结构相反)是树支持插入平衡。

于 2012-11-02T00:35:42.443 回答
0

经过广泛的研究,我必须得出结论,可以保存 MainMemoryStorage 对象,但无法加载它。可以通过派生类保存对象,该类跟踪所有使用的页面 ID(然后将它们保存到文件中)。加载这些页面是非常有问题的,因为需要直接访问

std::vector<Entry*> m_buffer;
std::stack<id_type> m_emptyPages;

来自 MemoryStorageManager.h。这些家伙是私有的,并且 MemoryStorageManager.h 不可用,因为这是一个仅可用于空间库的私有包含。

多么令人沮丧的答案。

于 2012-10-31T17:02:34.680 回答