广度优先搜索巨大的图形与小ram

时间:2010-02-13 18:04:13

标签: memory path graph breadth-first-search

我目前的图表中包含 1000万个节点 3500万个边缘。现在,在程序启动时将完整的图形加载到内存中。这需要几分钟(毕竟它是Java)并且需要大约半千兆字节的RAM。目前它运行在具有双核处理器和4千兆字节RAM的机器上。

使用广度优先搜索搜索图表时,内存使用率会上升到1千兆字节的峰值,平均需要10秒。

我想在几台计算机上部署该程序。除了图搜索之外的功能确实占用很少的资源。我的目标系统非常小巧,只有512兆字节的RAM。

有关如何实现方法(可能使用数据库)搜索该图形而不消耗太多内存的任何建议?程序在访问硬件设备时大多数时间处于空闲状态,因此路径查找最多可能需要5分钟才能显示上述图形...

感谢我的任何想法。

更新:

刚刚找到neo4j。有谁知道它是否适合这种巨大的图形?

3 个答案:

答案 0 :(得分:8)

你的问题有点模糊,但总的来说,一个好的策略主要遵循广度优先语义而使用与深度优先搜索相同的内存量是Iterative Deepening。这个想法是你首先进行深度优先搜索,限制为1级;如果找不到解决办法,从头开始并将其限制在2个等级;如果失败,请尝试3个级别,依此类推。

这一开始可能看起来有点多余,但是由于您正在进行深度优先搜索,因此您在内存中保留的节点要少得多,并且总是搜索比直接广度优先搜索更少的级别。由于级别中的节点数量呈指数级增长,因此在较大的图形上,保存最后一个额外级别很可能会因冗余地尝试所有前面的层而得到回报。

答案 1 :(得分:1)

我会说Neo4j绝对是一个很好的方式,当你有一个像这样的体面大小的图形。它不仅具有内置的BFS算法,还可以将数据保存在磁盘上,从而缩短启动时间。

在highscalability.com上查看:NEO4J - A GRAPH DATABASE THAT KICKS BUTTOX

我使用过Neo4j并且他们的文档非常好,并且它们提供了一些不错的入门示例,这只需要几分钟才能开始。

查看他们的 - Getting started in 10 minutes guide

答案 2 :(得分:0)

Neo4j将数据作为图形存储在数据库中,它将保持不变,您可以使用Graph Traversal Api(BFS,DBS,A * Dijkstra ...)或使用Cypher查询语言进行访问。