【问题标题】:Persistent (Disk Based) R-Tree (or R* Tree)持久(基于磁盘)R-Tree(或 R* 树)
【发布时间】:2012-11-28 07:02:31
【问题描述】:

如何将 R* 树实现为持久(基于磁盘)的树?保存 R* 树索引或保存叶值的文件架构是什么?

注意:此外,如何在这样的持久性 R* 树中执行插入、更新和删除操作?

Notes II:我已经实现了一个具有批量加载功能的内存 R-Tree。但我认为当我们谈论基于磁盘的磁盘时,这完全无关紧要。

【问题讨论】:

  • 您考虑过使用数据库吗?
  • 几年前,我们使用 Oracle 地理空间工具。但它有两个问题:1)我们的工作量很慢,2)在某些时候我们需要在一组地理围栏(多边形)中搜索,以查看给定点是否在其中。另一个原因是我们计划离开甲骨文。同时,我正在通过我自己编写的内存应用程序处理该搜索(并查找 NN 和路由等)。我的新问题是我编写它时好像我的原始数据是只读的,所以我将平衡树加载到内存中。但是添加新项目迫使我重新平衡树。
  • MongoDB 非常擅长地理空间索引。
  • 好吧,刚开始,当你遇到困难时更具体地询问。目前,这不是一个可以回答的问题。
  • 并非如此。问题仍然是“我应该从哪里开始”。无论你在哪里,从那里继续!

标签: c# java gis geospatial r-tree


【解决方案1】:

文件的架构

嗯,它是页面(= 块)。这些页面应该是底层存储页面大小的倍数,因此可能是 1kb 或 8kb 块。每个块都有一个编号,可以这样引用。

目录页面存储孩子的边界框及其页码。

子页面存储实际的数据对象。

管理树

好吧,理论上:每当您修改内存中的页面时,都会将更改写入磁盘。就是这样。

在实践中,您可能希望使用缓存来提高性能,并且您可能希望拥有事务以在应用程序崩溃时保持树的一致性。

关于这两个方面,您可以在 RDBMS 架构领域找到大量文献。

R*-tree 的一个主要优点是它是一个常规的面向页面的树,就像您在任何地方的数据库系统中都有它们一样。如果您在磁盘 B+-tree 上实现了良好的实现,则可以将大部分代码重用用于 R*-tree。

如何开始

要开始使用,您需要习惯基于磁盘的数据索引,就像在经典 RDBMS 中所做的那样。我建议从 on disk B-tree 或 B+-tree 开始。请允许删除,因为您需要考虑管理已删除的页面以及所有这些。

一旦你弄清楚了磁盘上的 B-Tree(可能会花一些时间来优化它!),做一个磁盘上的 R-tree 应该是相当明显的。

我没有查看代码,但这可能是一个很好的起点:http://www.die-schoens.de/prg/Looking for a disk-based B+ tree implementation in C++ or C 中链接的其他一些代码

【讨论】:

  • 感谢您的回答。但现在我完全迷路了!是否有任何一步一步的参考来理解一个人实际上会如何做到这一点?我已经下载并阅读了许多 Java 中的 R(*) Tree 实现以及一些 C 和 C++ 中的实现,但我一句都不懂!我确信我的观点非常错误(以前从未做过类似的事情)。
  • 有不止一种方法。而且它没那么简单。例如,您需要管理执行删除后将获得的空白页面。也许你应该从实现一个 B+-tree on disk 开始。 不要从内存中的实现开始。从一开始就在磁盘上工作。
  • 不幸的是,我从一个我非常喜欢的内存 R-Tree 开始:通过非常快的批量插入构建(在我的机器上 12 秒,2100000 个条目)和极快的搜索速度(不到 1 微秒),我在生产中使用它。也许这完全让我心烦意乱,因为我根本不懂这些代码!我已经完成了您之前所说的并从 B-Tree 开始,但这也无济于事!我无法从其余代码中排除“存储”的想法:(
  • 抱歉,存储管理是很多枯燥乏味的代码。没有任何一种方法可以将它放在磁盘上。您必须面对这个现实并开始使用低级磁盘访问。
【解决方案2】:

如果您需要磁盘上的 R-Tree 索引,我建议使用 SpatialitePostgis。 Spatialite 是轻量级的,易于嵌入到独立的应用程序中。或者,你看过C# Spatial Index project?。几年前我用 Java 编写了一个 R-Tree 实现,如果已经存在,我不建议这样做。

【讨论】:

  • 根据我对这个 SQLite 的时间框架是解决方案!
  • c# 空间索引是内存中的实现。
【解决方案3】:

如果您已经有一个主内存实现,您可以重复使用相同的代码,只需将写入添加到磁盘。您必须考虑页面大小并优化树节点以适应页面(您可以一口气阅读)。

将主内存树的快照存储在磁盘中会更好(在性能方面)(可以在树不处于高压下时拍摄快照)而不是将每个更改都写入磁盘。

在问题中,您指定查询树具有更高的重要性,因此您应该更好地使用 R*-tree,因为它可以最大限度地减少树节点之间的重叠。但是,如果您的要求将集中在更新操作(插入/删除)上,我建议您查看 Supporting frequent updates in R-trees: a bottom-up approach 论文。

【讨论】:

  • 我需要良好的读取性能。数据不会有太大变化,但是当它发生变化时,我需要快速平衡树本身。目前我正在使用我的所有数据构建树(不是通过插入节点)。
猜你喜欢
  • 2016-12-03
  • 2016-02-26
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
相关资源
最近更新 更多