簡體   English   中英

C ++空間索引庫:從磁盤加載/存儲主內存RTree

[英]C++ spatialindex library: loading/storing main memory RTree from/to disk

我已通過以下方式借助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?

因為無論如何都是批量加載樹,所以實際上沒有什么好處。 STR批量加載所做的只是對數據進行排序。 理論上,這是O(n log n) ,但是如果您對數據進行了適當的排序,則在大多數排序實現中,它實際上都將位於O(n)

因此,最有可能的是,將樹序列化為文件並返回並不比每次再次批量加載便宜。 不過,它確實失去了一些靈活性。

R樹通常用於動態數據恕我直言。 當然,它們確實適用於靜態數據。 但是它們的關鍵優勢(與其他結構相反)是樹支持插入時的平衡。

經過廣泛研究,我必須得出結論,可以保存MainMemoryStorage對象,但無法加載它。 可以通過派生類保存對象,該派生類跟蹤所有已使用的頁面ID(以后將它們保存到文件中)。 加載這些頁面非常麻煩,因為需要直接訪問

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

從MemoryStorageManager.h。 這些人是私有的,MemoryStorageManager.h不可用,因為這是僅適用於空間庫的私有包含。

真是令人沮喪的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM