2012-10-30 5 views
3

공간 라이브러리에 레코드를 하나씩 삽입하여 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() 함수를 호출하고, 내 데이터를 검색하고, 정렬 한 다음 빌드 단계에서 오류를 분류합니다. 모든 단서 방법? 예, 오류 :

답변

1

이 문제는 메모리 할당과 코드의 몇 가지 버그 (메모리 할당과 관련 있음)에 기인합니다.

memcpy(data->m_region.m_pLow, bbox, 2 * sizeof(double)); 
memcpy(data->m_region.m_pHigh, bbox + 2, 2 * sizeof(double)); 
data->m_id = gid; 

두 번째 (가장 중요) GETNEXT 모든 값을 새로운 객체를 반환해야합니다 :

RTree::Data *p = new RTree::Data(returnData->m_dataLength, returnData->m_pData, 
returnData->m_region, returnData->m_id); 
return returnData; 

드 할당 메모리는 첫째 하나 제대로 데이터 변수의 속성을 할당 할 필요가 RTree에 의해 행해지므로 여기서는 아무런주의를 기울이지 않아도됩니다.

관련 문제