非常に大きな無向で重みのないグラフ (数億の頂点から始まり、頂点あたり最大 10 個のエッジ) があり、分散されておらず、シングル スレッドのみで処理され、幅優先検索を実行したいとします。それらは I/O バウンドであると予想されるため、BFS に適したディスク ページ レイアウトが必要です。ディスク容量は問題ではありません。検索は、すべての頂点で同じ確率で開始できます。直観的には、異なるディスク ページ上の頂点間のエッジの数を最小限に抑えることを意味します。これは、グラフの分割の問題です。
グラフ自体はスパゲッティのように見えます。ランダムに相互接続されたポイントのランダムなセットを考えてみてください。短いエッジに偏りがあります。
問題は、どのようにして 1 つのパーティション グラフをこのように大きくするかということです。私が見つけた利用可能なグラフ パーティショナーは、メモリにのみ収まるグラフで動作します。ストリーミング グラフ パーティショニング アルゴリズムの説明も実装も見つかりませんでした。
または、BFS で適切に機能するディスク レイアウトを取得するためのパーティション グラフの代わりになるものがあるでしょうか?
現在、近似として、頂点に空間座標が関連付けられているという事実を使用し、頂点をヒルベルトのソート順でディスクに配置します。このようにして、空間的に近い頂点は同じページに配置されますが、それらの間のエッジの有無は完全に無視されます。私はもっとうまくやれるだろうか?
別の方法として、頂点のヒルベルト ソート順を使用してグラフを断片に分割し、サブグラフを分割し、それらをつなぎ合わせて、継ぎ目の不十分な分割を受け入れることができます。
私がすでに調べたいくつかのこと:
- 数十億のノードと頂点を持つ大規模な重み付けされていない有向グラフを保存する方法
- 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 はどこからでも開始できるという情報。編集:サブグラフの分割に関するアイデア