공간 라이브러리에 레코드를 하나씩 삽입하여 R * 트리를 성공적으로 작성한 후 250 만회를로드 할 때 대량로드로 R * 트리를 만들려고했습니다. DBStream 클래스를 구현하여 반복적으로 BulkLoader에 데이터를 제공했습니다. 본질적으로, 다음과 같은 메소드를 호출하고 Bulkloader 대한 오브젝트 데이터 (코드에 D 변수) 제조 : I가 DBStream 객체를 초기화하고, 다음과 같은 방법으로 대량로드를 호출spatialindex 라이브러리로 R * 트리를 BulkLoading
void DBStream::retrieveTuple() {
if (query.next()) {
hasNextBool = true;
int gid = query.value(0).toInt();
// allocate memory for bounding box
// this streets[gid].first returns bbox[4]
double* bbox = streets[gid].first;
// filling the bounding box values
bbox[0] = query.value(1).toDouble();
bbox[1] = query.value(2).toDouble();
bbox[2] = query.value(3).toDouble();
bbox[3] = query.value(4).toDouble();
rowId++;
r = new SpatialIndex::Region();
d = new SpatialIndex::RTree::Data((size_t) 0, (byte*) 0, *r, gid);
r->m_dimension = 2;
d->m_pData = 0;
d->m_dataLength = 0;
r->m_pLow = bbox;
r->m_pHigh = bbox + 2;
d->m_id = gid;
} else {
d = 0;
hasNextBool = false;
cout << "stream is finished d:" << d << endl;
}
}
을 :
// creating a main memory RTree
memStorage = StorageManager::createNewMemoryStorageManager();
size_t capacity = 1000;
bool bWriteThrough = false;
fileInMem = StorageManager
::createNewRandomEvictionsBuffer(*memStorage, capacity, bWriteThrough);
double fillFactor = 0.7;
size_t indexCapacity = 100;
size_t leafCapacity = 100;
size_t dimension = 2;
RTree::RTreeVariant rv = RTree::RV_RSTAR;
DBStream dstream();
tree = RTree::createAndBulkLoadNewRTree(SpatialIndex::RTree::BLM_STR, dstream,
*fileInMem,
fillFactor, indexCapacity,
leafCapacity, dimension, rv, indexIdentifier);
cout << "BulkLoading done" << endl;
대량로드는 my next() 및 hasNext() 함수를 호출하고, 내 데이터를 검색하고, 정렬 한 다음 빌드 단계에서 오류를 분류합니다. 모든 단서 방법? 예, 오류 :