2012-10-31 87 views
0

我已經創建了一個主存儲器R *與以下列方式spatialindex庫的幫助索引(DBStream實現用於bulkLoading的界面)C++ spatialindex庫:加載/存儲主存儲器RTREE從/向磁盤

// 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

在我看來,我可以重用RTree :: loadRTree函數 – arthur

回答

1

由於您無論如何都批量加載樹,實際上這裏幾乎沒有什麼收穫。 STR大容量裝載所做的就是對數據進行排序。理論上這是O(n log n),但是如果你有適當的數據排序,它實際上將在O(n)與大多數排序實現。

因此,最有可能的是,將樹序列化爲文件並返回,並不比每次批量加載它便宜得多。但它確實帶走了一些靈活性。

R樹一般是爲動態數據恕我直言。當然,他們確實爲靜態數據工作。但是他們的主要優勢(與其他結構相反)是樹支持插入平衡。

+0

這是一個有趣的觀察,我通過從數據庫中讀取數據來裝載樹,因爲它是select *,因此數據庫開銷可能不是那麼重要,我會嘗試比較這些數字並在這裏發佈它們.. – arthur

0

經過廣泛的研究後,我必須得出結論:可以保存MainMemoryStorage對象,但不可能加載它。可以通過派生類保存對象,派生類跟蹤所有使用的頁面ID(並將其保存到文件中)。加載這些頁面是非常有問題的,因爲需要直接訪問來自MemoryStorageManager.h的

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

。這些人是私人的,MemoryStorageManager.h不可用,因爲這是一個私人包含,只提供給spatiallibrary。

真是令人沮喪的答案。

+0

我使用保存和加載功能擴展了MainMemoryStorage類。答案發布在圖書館的郵件列表 – arthur

+0

但是我希望它也發佈在這裏:-( – Richard