C++ Boost::Geometry R*树和分页/延迟加载?

C++ Boost::Geometry R*树和分页/延迟加载?,c++,tree,boost-geometry,C++,Tree,Boost Geometry,昨天我尝试使用SqLite3 RTree虚拟表从查询by(WGS)坐标中获取一个或多个“数据”ID。它工作得很快!不幸的是,插入/构建rtree的速度很慢(土耳其需要半小时) 发现Boost::Geometry库也有一个RTree实现。我对这个RTree的问题是: 我可以对这个r*树使用分页或延迟加载吗? 我们有大地图,只想在通过相应坐标查询id时将id加载到rtree中。 它就像一个数据库,只在用户请求时才加载页面 非常感谢 HenryBoost.Geometry rtree实现支持有状态分配

昨天我尝试使用SqLite3 RTree虚拟表从查询by(WGS)坐标中获取一个或多个“数据”ID。它工作得很快!不幸的是,插入/构建rtree的速度很慢(土耳其需要半小时)

发现Boost::Geometry库也有一个RTree实现。我对这个RTree的问题是: 我可以对这个r*树使用分页或延迟加载吗? 我们有大地图,只想在通过相应坐标查询id时将id加载到rtree中。 它就像一个数据库,只在用户请求时才加载页面

非常感谢


Henry

Boost.Geometry rtree实现支持有状态分配器。例如,可以将它与Boost.Interprocess一起使用,将rtree存储在或中

如果您能够实现一个分配器,在文件中保存/加载节点,并在取消引用该分配器返回的指针时允许访问数据,那么它就可以工作了

然而,如果分配器在需要时加载数据块,那么它可能不会那么简单。加载和访问数据很简单,但分配器(或管理器)将被迫知道何时不再需要数据,目前无法直接获取该信息。可以间接地获得它,但是rtree在这种情况下没有经过测试,因此您的问题的官方答案是它不受支持

我计划添加对持久性存储的支持,但由于时间不够,我没有这样做。如果你有一些想法,想帮忙,等等,我邀请你上

编辑:

实际上,如果用户明确地通知有状态分配器操作完成,例如,在进行插入之后,或者每完成一定数量的插入或查询,就可以执行此操作。分配器仍然可以存储一些使用指标(例如,作为取消引用计数器)并进行一些缓存,但它知道如果需要,可以删除一些节点。我想它与ios flush()类似。但是,在包装/散装货物的情况下,它仍然无法开箱即用,因为包装/散装货物是以自上而下的方式处理元件的。因此:

persistent_allocator alloc(/*...*/);
bgi::rtree</*...*/> rt(/*...*/, alloc);
// ...
rt.insert(/*...*/);
rt.insert(/*...*/);
rt.insert(/*...*/);
alloc.flush();
persistent_分配器alloc(/*…*/);
bgi::rtree-rt(/*…*/,alloc);
// ...
rt.插入(/*…*/);
rt.插入(/*…*/);
rt.插入(/*…*/);
alloc.flush();

感谢您的快速回答!我会看一下邮件列表。