假设我有一个非常大的无向、未加权图(从数亿个顶点开始,每个顶点约 10 条边),非分布式且仅由单线程处理,并且我想对其进行广度优先搜索。我希望它们受 I/O 限制,因此我需要一个适合 BFS 的磁盘页面布局,磁盘空间不是问题。搜索可以以相等的概率从每个顶点开始。直观地说,这意味着最小化不同磁盘页面上顶点之间的边数,这是一个图分区问题。
图本身看起来像意大利面条,想想随机互连的随机点集,对较短的边有一些偏见。
问题是,一个分区图怎么这么大?我发现可用的图形分区器仅适用于内存中的图形。我找不到任何流图分区算法的描述或实现。
或者,也许有一种替代分区图的方法来获得适用于 BFS 的磁盘布局?
现在作为一个近似值,我使用顶点附有空间坐标的事实,并将顶点以希尔伯特排序顺序放在磁盘上。这种方式空间上接近的顶点落在同一页面上,但它们之间是否存在边缘被完全忽略。我能做得更好吗?
作为替代方案,我可以使用 Hilbert 顶点排序顺序将图拆分为多个部分,对子图进行分区,将它们缝合回去并接受接缝上的不良分区。
我已经研究过的一些事情:
- 如何存储具有数十亿个节点和顶点的大型有向未加权图
- http://neo4j.org/ - 我发现关于它如何在磁盘上进行图形布局的零信息
分区实现(除非我弄错了,它们都需要将图形放入内存):
- http://glaros.dtc.umn.edu/gkhome/views/metis
- http://www.sandia.gov/~bahendr/chaco.html
- http://staffweb.cms.gre.ac.uk/~c.walshaw/jostle/
- http://www.cerfacs.fr/algor/Softs/MESHPART/
编辑:关于图表的外观以及 BFS 可以在任何地方开始的信息。编辑:关于划分子图的想法