13

何億ものノードを持つ超大規模なNetworkXGraphオブジェクトを処理しようとしています。コンピュータのメモリをすべて消費しないように、ファイルに書き込めるようにしたいと思います。ただし、既存のノードを常に検索したり、エッジを更新したりする必要があります。

これに対する良い解決策はありますか?http://networkx.lanl.gov/reference/readwrite.htmlで提供されているファイル形式のいずれかでどのように機能するかわかりません

私が考えることができる唯一の解決策は、各ノードをファイルシステム内の他のノードへの参照を含む個別のファイルとして保存することです。そうすれば、検査のために1つのノードを開いても、メモリが過負荷になることはありません。独自の定型コードを記述せずにこれを行うための大量のデータ(PyTablesなど)用の既存のファイルシステムはありますか?

4

3 に答える 3

24

最初に試してくださいpickle; 任意のオブジェクトをシリアル化するように設計されています。

DiGraphを作成してファイルにシリアル化する例:

import pickle
import networkx as nx

dg = nx.DiGraph()
dg.add_edge('a','b')
dg.add_edge('a','c')
pickle.dump(dg, open('/tmp/graph.txt', 'w'))

DiGraphファイルからのロードの例:

import pickle
import networkx as nx

dg = pickle.load(open('/tmp/graph.txt'))
print dg.edges()

出力:

[('a', 'c'), ('a', 'b')]

これが十分に効率的でない場合は、シリアル化するための独自のルーチンを作成します。

  1. エッジと
  2. ノード(ノードがエッジに入射しない場合)。

可能な場合はリスト内包表記を使用すると、(標準のforループの代わりに)はるかに効率的になる可能性があることに注意してください。

これが十分に効率的でない場合は、Python内からC ++ルーチンを呼び出します: http : //docs.python.org/extending/extending.html

于 2012-07-06T01:26:46.147 に答える
4

これをNetworkXグラフとして作成した場合は、すでにメモリ内にあります。この大きなグラフの場合、別のファイルで提案したのと同様のことを行う必要があると思います。ただし、個別のファイルを使用する代わりに、データベースを使用して、ノード間の多対多の接続を持つ各ノードを格納します。つまり、ノードのテーブルとエッジのテーブルがあり、特定のノードの隣接ノードをクエリするには、その特定のノードが両端にあるエッジをクエリするだけです。これは高速であるはずですが、最初にネットワーク全体をメモリに構築せずにNetworkXの分析機能を利用できるかどうかはわかりません。

于 2012-08-06T20:10:54.523 に答える
0

StackOverflowで最初に解決するために来た問題を忘れましたが、この質問に出くわしました。(10年近く遅すぎます!)この問題を正確に解決するために作成したnetworkxのようなライブラリであるGrandをお勧めします。

import networkx as nx

g = nx.DiGraph()
g.add_edge("A", "B")
print(len(g.edges()))

import grand
from grand.backends import SQLBackend # or choose another!

g = grand.Graph(backend=SQLBackend())
g.nx.add_edge("A", "B")
print(len(g.nx.edges()))

APIはNetworkXと同じですが、データはSQL、DynamoDBなどに存在します。

于 2020-11-20T02:54:14.607 に答える