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

时间:2014-11-20 12:54:16

标签: c++ tree boost-geometry

我昨天尝试了SqLite3 R Tree虚拟表来获取一个或多个" Data"通过(WGS)坐标查询的ID。它工作得非常快!不幸插入/建立r 树的速度很慢(土耳其半小时)。

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

非常感谢!

亨利

1 个答案:

答案 0 :(得分:4)

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

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

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

我计划添加对持久存储的支持,但由于时间不够而没有这样做。如果您有一些想法,想要帮助等等,我邀请您加入mailing list

编辑:

实际上,如果有状态分配器被用户明确通知操作完成,例如,可以这样做。插入之后或每个完成的插入或查询。分配器仍然可以存储一些使用度量(例如,作为解除引用计数器)并进行一些缓存,但是它知道如果需要可以删除一些节点。我想它与ios flush()类似。在包装/批量装载的情况下,它仍然无法开箱即用,它以自上而下的方式处理元件。所以:

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