使用空间indexex库将r*树的散装
BulkLoading the R* tree with spatialindex library
成功地构建了R*树用空间库插入记录一对一的250万次后,我试图用散装创建R*树。我将DBStream类实现为迭代将数据提供给Bulkloader。本质上,它调用以下方法并准备了散装器的数据(代码中的D变量)对象:
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;
}
}
i初始化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;
批量加载调用我的下一个()和hasnext()函数,检索我的数据,对其进行分组,然后在构建阶段进行SEG故障。有线索吗?是的,错误是:
RTree::BulkLoader: Building level 0
terminate called after throwing an instance of 'Tools::IllegalArgumentException'
问题据说在内存分配中,而代码中的一些错误(在某种程度上与内存分配也有所相关)。首先,需要正确分配数据变量的属性:
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完成,因此不需要注意这里。
相关文章:
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 如何使用 C++ gdal 库将栅格地理从 EGM96 转换为 WGS84 椭球体高度基准面
- CMake 如何强制third_party库将项目文件包含在当前项目源目录中?
- 无法使用 azure-iot-arduino 库将 azure IoT 中心与 esp8266 连接
- <int> 使用 fmt 库将向量转换为字符串
- 使用霍华德·欣南特的日期库将时间信息添加到year_month_day
- 如何使用 GSL 库将雅可比矩阵引用为空指针
- C++ SNAP 库将 std::string 转换为 TStr
- 使用霍华德·欣南特的日期库将双倍转换为zoned_time
- 使用标准库将循环替换为 strtok
- 如何使用Imebra库将压缩像素(用我自己的编码器压缩)回到DICOM图像文件中
- 静态库将转换为共享的lib符号隐藏
- 库将ARM架构错误编译为架构X64
- 如何使用 c++ 文件系统库将文件复制到另一个目录
- 提升图形库 - 将矢量推送到边缘属性
- 使用 occi 库将 c++ 程序与 Oracle 连接起来
- 如何在 c++ Linux 中使用 ICU 库将 UnicodeString 转换为 windows-1251
- 使用特征C++库将每个矩阵列乘以每个向量元素
- 如何使用特征库将大型 2D 数组转换为稀疏矩阵
- 使用空间indexex库将r*树的散装