BulkLoading R * дерево с библиотекой spatialindex

После успешного построения дерева R * с пространственной библиотекой, вставляющей записи один за другим 2,5 миллиона раз, я пытался создать дерево R * с массовой загрузкой. Я реализовал класс DBStream для итеративной передачи данных в BulkLoader. По сути, он вызывает следующий метод и подготавливает объект Data (переменная d в коде) для Bulkloader:

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;
}
}

Я инициализирую объект DBStream и вызываю массовую загрузку следующим образом:

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

Массовая загрузка вызывает функции next () и hasNext (), извлекает мои данные, сортирует их и затем обнаруживает ошибки на этапе сборки. Любой путь подсказок? Да, ошибка в следующем:

    RTree::BulkLoader: Building level 0
terminate called after throwing an instance of 'Tools::IllegalArgumentException'

3

Решение

Предположительно, проблема заключается в распределении памяти и нескольких ошибках в коде (в некоторой степени связанных с распределением памяти). Во-первых, нужно правильно назначить свойства переменной Data:

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 выполняет выделение памяти, поэтому здесь не нужно заботиться.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector