C++ 内存中Boost r树与映射文件的性能差异

C++ 内存中Boost r树与映射文件的性能差异,c++,performance,ubuntu-14.04,r-tree,boost-geometry,C++,Performance,Ubuntu 14.04,R Tree,Boost Geometry,我需要创建一个3D R*树,可能是为了长时间存储,但性能也会是一个问题。 为了创建树,我决定使用Boost的spacialindex,并基本上找到了两种可能的方法 或者我直接使用对象创建它,因为它在这里:,但是这不允许我在不再次创建R*-树的情况下存储和加载它 或者我可以使用映射文件,如这里所述:,但是,我不确定在这种情况下查询的性能是否足够好 我的r树将包含数千个条目,但很可能不到100000个。现在我的问题是,与使用标准对象相比,使用映射文件是否存在性能问题?此外,如果创建一个大约10000

我需要创建一个3D R*树,可能是为了长时间存储,但性能也会是一个问题。 为了创建树,我决定使用Boost的spacialindex,并基本上找到了两种可能的方法

或者我直接使用对象创建它,因为它在这里:,但是这不允许我在不再次创建R*-树的情况下存储和加载它

或者我可以使用映射文件,如这里所述:,但是,我不确定在这种情况下查询的性能是否足够好

我的r树将包含数千个条目,但很可能不到100000个。现在我的问题是,与使用标准对象相比,使用映射文件是否存在性能问题?此外,如果创建一个大约100000个值的R*-树不需要花费大量时间(我可以将所有边界框和相应的键/数据存储在一个文件中),那么跳过映射文件并在每次运行程序时创建树可能是更好的选择


希望有人能在这里帮助我,因为文档并没有提供太多的信息(尽管它仍然比libspacialindex的文档要好)。

映射文件的行为大部分类似于常规内存(事实上,在Linux中,使用
new
malloc
的内存分配将使用
mmap
[使用“无文件”备份存储]作为底层分配方法)。但是,如果您“到处”执行许多小写入操作,并且映射到真实文件,则操作系统将在写入文件之前限制缓冲写入量

我在不久前提到这个主题时做了一些实验,通过调整操作系统如何处理这些“挂起的写入”的设置,我获得了合理的性能,甚至对于具有随机读/写模式的文件备份内存映射(我希望在构建树时会发生这种情况)

以下是“随机写入mmap的性能”问题,我认为这与此高度相关: (这个答案适用于Linux-其他操作系统,特别是Windows,在处理对映射文件的写入时,其行为可能完全不同)

当然,在内存映射文件和每次程序运行时重建之间,很难说“哪个更好”——这实际上取决于应用程序的功能,是每秒运行100次,还是每天运行一次,重建所需的时间[我完全不知道!]有两种选择:构建最简单的版本,看看它是否“足够快”,或者构建两个版本,然后测量差异有多大,然后决定走哪条路

我倾向于构建简单的(ish)模型,如果性能不够好,找出慢度的来源,然后解决这个问题-它可以节省大量时间,使占总执行时间0.01%的东西运行快5个时钟周期,并最终在其他地方出现一个大thinko,使其运行速度比您预期的慢500倍…

批量加载g索引比重复插入快得多,生成的树效率更高。因此,如果您可以将所有数据保存在主内存中,我建议使用STR批量加载重建树。根据我的经验,这已经足够快了(批量加载时间比I/O时间要短)


STR的成本大致相当于排序的成本。
O(n log n)
理论上,常数非常低(效率较低的实现可能是
O(n log n log n)
,但这仍然相当便宜).

谢谢你的快速回答。当然,你是对的,这完全取决于程序的使用。不幸的是,如果你在一个更大的项目中工作,我的部分将如何准确地使用还没有定论,在我必须完成之前我可能不知道。谢谢你指出你的性能测试,我会看一看。If noone(如创建此库的Adam Wulkiewicz)答案,我会接受你的。这可能不是对我问题的确切回答,但涵盖了整个主题。这个答案不错,但太具体了,因为OP没有指明他的操作系统,所有真正的内容都只适用于Linux。我已经将我的操作系统添加到标签中了!谢谢你指出它。@Puppy:ou我不知道这个性能分析是“仅限linux”,但我不知道除了“刷新写入”之外还有什么其他原因是速度慢的原因——当然,Windows可能没有对此进行调整……或者你真的知道“映射文件的行为不像常规内存”的原因吗在其他一些操作系统中?同样,如果您正在构建一个模块,该模块将集成到另一个更大的程序中,那么谨慎的做法是尝试了解您的模块的性能是否“非常关键,因为它在您每次执行X时都会被使用,并且X在我们的系统中非常常见”,或者“不太关键,因为它每天只发生一次,这种情况下的延迟也不太关键”[请注意,“很少发生”并不真正意味着“性能不关键”-在汽车系统中,防抱死制动器预计会“快速”工作,即使不经常,但启动发动机“并不重要”“感谢您的回复。我最初想实现打包算法,但找不到如何创建树。除了bgi::rstar、bgi::linear和bgi::Quadrastic,我没有找到任何其他内容(bgi=boost::geometry::index)。还有,这究竟如何解决我的存储等问题呢?我没有使用bgi,所以我不知道该功能是否可用。但它比完整的R*树更容易实现,所以如果它们没有批量加载,我会感到惊讶。批量加载很便宜,我想你不需要存储该树。谢谢,我会研究一下,然后ee,如果我能找到它,我仍然能找到。是的,如果树很快被创建,那么我就不需要了