C++ C++;spatialindex库:从磁盘加载/存储主存RTree

C++ C++;spatialindex库:从磁盘加载/存储主存RTree,c++,r-tree,libspatialindex,C++,R Tree,Libspatialindex,我通过以下方式在spatialindex库的帮助下创建了一个主存R*索引(DBStream实现了批量加载接口) 我的数据是只读的,也就是说,我只想构建一次树,保存它,并在每次使用我的程序时从持久性存储重新加载。显然,我可以自己保存和加载memStorage,但如何从中重新创建RTree?经过广泛研究,我必须得出结论,可以保存MainMemoryStorage对象,但无法加载它。可以通过一个派生类保存对象,该派生类跟踪所有使用的页面ID(然后将它们保存到文件中)。加载这些页面非常困难,因为需要直接

我通过以下方式在spatialindex库的帮助下创建了一个主存R*索引(DBStream实现了批量加载接口)


我的数据是只读的,也就是说,我只想构建一次树,保存它,并在每次使用我的程序时从持久性存储重新加载。显然,我可以自己保存和加载memStorage,但如何从中重新创建RTree?

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

std::vector<Entry*> m_buffer;
std::stack<id_type> m_emptyPages;
std::向量m_缓冲区;
std::堆栈m_清空页;
来自MemoryStorageManager.h。这些人是私有的,MemoryStorageManager.h不可用,因为这是一个私有包含,仅对spatiallibrary可用


这是一个多么令人沮丧的回答。

因为你无论如何都在大量装载这棵树,实际上,在这方面没有什么收获。STR批量加载所做的就是对数据进行排序。理论上,这是
O(n log n)
,但是如果您对数据进行了适当的排序,那么在大多数排序实现中,它实际上将处于
O(n)

因此,很有可能,将树序列化为文件并返回并不比每次重新大容量加载要便宜多少。不过,这确实剥夺了一些灵活性


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

在我看来,我可以重用RTree::loadRTree函数,这是一个有趣的观察结果。我通过从数据库读取数据来加载树。由于它是select*,因此数据库开销可能没有那么大。我将尝试比较这些数字并将它们发布在这里..我使用保存和加载功能扩展了MainMemoryStorage类。答案发布在图书馆的邮件列表中,但我希望它也发布在这里:-(
std::vector<Entry*> m_buffer;
std::stack<id_type> m_emptyPages;