提升::几何 R*树和分页/延迟加载

Boost::Geometry R*Tree and Paging/Lazy load?

本文关键字:分页 延迟加载 几何 提升      更新时间:2023-10-16

我昨天尝试了 SqLite3 R树虚拟表,以通过 (WGS) 坐标查询获取一个或多个"数据"ID。它工作得非常快!不幸的是,插入/构建r树很慢(土耳其需要半小时)。

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

多谢!

亨利

Boost.Geometry rtree

实现支持有状态分配器。 例如,可以将其与 Boost.Interprocess 一起使用,将 rtree 存储在共享内存或映射文件中。

如果您能够实现分配器将节点保存到/从文件加载,并允许在此分配器返回的指针被取消引用时访问数据,那么它将起作用。

但是,在

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

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

编辑:

实际上,如果用户明确地通知有状态分配器有关操作完成的信息,例如,在进行插入之后或根据一定数量的已完成插入或查询,则可以完成此操作。分配器仍然可以存储一些使用指标(例如作为取消引用计数器)并进行一些缓存,但它知道如果需要,可以删除一些节点。我想它会类似于ios flush()。在以自上而下的方式处理元素的打包/批量加载的情况下,它仍然无法开箱即用。所以:

persistent_allocator alloc(/*...*/);
bgi::rtree</*...*/> rt(/*...*/, alloc);
// ...
rt.insert(/*...*/);
rt.insert(/*...*/);
rt.insert(/*...*/);
alloc.flush();