7

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

当使用广度优先搜索来搜索图表时,内存使用量会上升到 1 GB 的峰值,平均需要 10 秒。

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

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

感谢您向我提出的任何想法。

更新:

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

4

3 回答 3

8

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

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

于 2010-02-13T18:26:39.323 回答
1

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

在 highscalability.com 上查看此内容:NEO4J - A Graph DATABASE THAT KICKS BUTTOX

我使用过 Neo4j,他们的文档非常好,而且他们提供了一些不错的入门示例,确实只需要几分钟就可以开始。

查看他们的 - 10 分钟入门指南

于 2010-02-13T21:32:31.130 回答
0

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

于 2014-04-17T15:56:41.167 回答