数百万のノードと数千万のエッジを持つ大規模ネットワークのネットワーク分析に興味があります。多くのフォーマットからネットワークを解析し、接続されたコンポーネントを見つけ、コミュニティを検出し、PageRankのような中心性の測定を実行できるようにしたいと考えています。
私はNetworkXに魅力を感じています。それには、Nice APIと優れたドキュメントがあり、長年にわたって活発に開発されてきました。加えて、それはpythonであるため、すぐに開発できます。
最近のプレゼンテーション(スライドはgithub here で入手可能)で、次のように主張されています。
他の多くのツールとは異なり、NXは現代の問題に関連するスケールでデータを処理するように設計されています... NXのコアアルゴリズムのほとんどは、非常に高速なレガシーコードに依存しています。
プレゼンテーションでは、NetworkXの基本アルゴリズムはC/Fortranで実装されているとも述べています。
しかし、ソースコードを見ると、NetworkXは主にPythonで記述されているようです。私はソースコードにあまり詳しくありませんが、NetworkXがnumpyを使用して重いリフティングを行う(C/Fortranを使用して線形代数を実行する)例をいくつか知っています。たとえば、ファイルnetworkx/networkx/algorithms/centrality/eigenvector.py
は、numpyを使用して固有ベクトルを計算します。
Numpyのような最適化されたライブラリを呼び出すこの戦略がNetworkX全体で本当に普及しているのか、それとも少数のアルゴリズムでそれが実行されているのか、誰か知っていますか?また、NetworkXに関連する他のスケーラビリティの問題について誰かが説明できますか?
NetworkX Lead Programmerからの返信私はNetworkXメーリングリストにこの質問を投稿し、Aric Hagbergが返信しました:
NetworkXで使用されるデータ構造は、大きな問題へのスケーリングに適しています(たとえば、データ構造は隣接リストです)。アルゴリズムにはさまざまなスケーリングプロパティがありますが、あなたが言及したもののいくつかは使用可能です(たとえば、PageRank、接続されたコンポーネントは、エッジの数の線形複雑性です)。
この時点で、NetworkXは純粋なPythonコードです。隣接構造はPython辞書でエンコードされているため、メモリと計算速度を犠牲にして非常に柔軟性があります。大きなグラフ大量のメモリを消費し、最終的にはメモリ不足になります。
NetworkXは、主に線形代数に基づくアルゴリズムにNumPyとSciPyを使用します。その場合、グラフはNumPy行列またはSciPy疎行列のいずれかを使用して隣接行列として表されます(コピーされます)。これらのアルゴリズムは、NumPyおよびSciPYの内部で使用されているレガシーCおよびFORTRANコードの恩恵を受けることができます。
あなたの大きな問題は記憶です。 Python単純にcannotクラス実装でフープを飛び越えずに数千万のオブジェクトを処理します。多くのオブジェクトのメモリオーバーヘッドが高すぎるため、2GBに達し、 32ビットコードは機能しません。スロット、配列、またはnumpyを使用する方法があります。shouldは問題ありません。networkxはパフォーマンスを目的として作成されているためですが、機能しないものがいくつかある場合はあなたのメモリ使用量をチェックします。
スケーリングに関しては、アルゴリズムは基本的にグラフで重要な唯一のものです。グラフアルゴリズムはreallyが正しくない場合は醜いスケーリングになる傾向があり、他の言語と同じようにPythonで正しく実行される可能性が高くなります。
これは古い質問ですが、 graph-tool はNetworkXと非常によく似た機能を備えていますが、テンプレートを使用してC++で実装されています(Boost Graph Libraryを使用)。はるかに高速( 最大2桁 )で、メモリ使用量が大幅に少なくなります。
免責事項:私はグラフツールの作者です。