持久(基于磁盘)R树(或R *树)

时间:2012-11-28 07:02:31

标签: c# java gis geospatial r-tree

如何将R * Tree实现为持久性(基于磁盘)?用于保存R * Tree索引或保存叶子值的文件的体系结构是什么?

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

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

3 个答案:

答案 0 :(得分:8)

文件架构

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

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

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

管理树

那么,从理论上讲:无论何时修改内存中的页面,都要将更改写入磁盘。就是这样。

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

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

R * -tree的一个主要好处是它是一个常规的面向页面的树,就像你在整个地方的数据库系统中一样。如果你有一个很好的磁盘B + -tree实现,你可以重用你的大部分代码用于R * -tree。

如何开始

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

一旦你在磁盘上找到B-Tree(并且可能花一些时间来优化它!),做一个磁盘上的R树应该是相当明显的。

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

将磁盘中存储的主内存树的快照(当树不在高压下时可以拍摄快照)与将每个更改写入磁盘相比,会更好(性能明智)。

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