我已经通过以下方式在spatialindex库的帮助下创建了一个主内存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?
答案 0 :(得分:1)
因为无论如何你都在大量加载树,实际上这里几乎没有什么好处。 STR批量加载所做的就是对数据进行排序。理论上这是O(n log n)
,但是如果你对数据进行了适当的排序,它实际上会在大多数排序实现的O(n)
中。
所以最有可能的是,将树序列化为文件并返回并不比每次批量加载它便宜得多。它确实消除了一些灵活性。
R-Trees通常用于动态数据IMHO。当然,他们确实为静态数据工作。但是它们的关键优势(与其他结构相反)是树支持插入平衡。
答案 1 :(得分:0)
经过广泛研究后,我必须得出结论,可以保存MainMemoryStorage对象,但无法加载它。可以通过派生类保存对象,派生类跟踪所有使用的页面ID(稍后将它们保存到文件中)。加载这些页面非常有问题,因为需要直接访问
std::vector<Entry*> m_buffer;
std::stack<id_type> m_emptyPages;
来自MemoryStorageManager.h的。这些人是私人的,MemoryStorageManager.h不可用,因为这是一个私人包含只适用于spatiallibrary。
多么令人沮丧的答案。