0

次の方法で、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);

私のデータは読み取り専用です。つまり、ツリーを 1 回だけ作成して保存し、プログラムを使用するたびに永続ストレージから再ロードしたいと考えています。明らかに、memStorage を自分で保存してロードすることはできますが、そこから RTree を再作成するにはどうすればよいでしょうか?

4

2 に答える 2

1

とにかくツリーを一括ロードしているので、実際にはここで得られるものはほとんどありません。STR バルク ロードで行われるのは、データの並べ替えだけです。これはO(n log n)理論上ですが、データを適切に並べ替えれば、実際にはO(n)ほとんどの並べ替えの実装に含まれます。

したがって、ほとんどの場合、ツリーをファイルにシリアライズして戻すことは、毎回再度一括ロードするよりもはるかに安価ではありません。ただし、ある程度の柔軟性は失われます。

一般に、Rツリーは動的データIMHOを対象としています。確かに、それらは静的データに対して機能します。しかし、(他の構造とは対照的に) それらの主な強みは、ツリーが挿入時のバランス調整をサポートしていることです。

于 2012-11-02T00:35:42.443 に答える
0

広範な調査の結果、MainMemoryStorage オブジェクトを保存することは可能ですが、読み込むことは不可能であると結論付けなければなりません。オブジェクトの保存は、使用されているすべてのページ ID を追跡する派生クラスを介して可能です (後でそれらをファイルに保存します)。これらのページのロードは、直接アクセスする必要があるため、非常に問題があります。

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

MemoryStorageManager.h から。これらの人はプライベートであり、MemoryStorageManager.h は利用できません。これは、spatiallibrary のみが利用できるプライベート インクルードであるためです。

なんと憂鬱な答えでしょう。

于 2012-10-31T17:02:34.680 に答える