2015-12-09 31 views
1

我有一個數據集是一個代表網絡的csv/txt文件。文件中的每一行都包含由逗號分隔的兩個節點名稱。我的數據文件聯繫了大約330k個節點和大約550k個邊緣。我嘗試使用下面的代碼創建的這只是一個非常基本的圖形(是的,我知道這將是非常混亂):如何監視networkx圖形創建的狀態?

import networkx as nx 
import matplotlib.pyplot as plt 
import sys 
import numpy as np 

f = open('dataFile.txt', 'rb') 
G = nx.read_edgelist(f, delimiter=',', nodetype=str) 
f.close() 

print(nx.number_of_nodes(G)) 
print(nx.number_of_edges(G)) 

plt.figure(1) 
nx.draw(G) 
plt.savefig("graph.pdf") 

我上的AWS EC2實例m4.4xlarge運行此,它是固定在100%的CPU上,只佔內存的1%。

我對此表示懷疑,因爲我認爲networkx是內存密集型的,而不是CPU豬。現在,它正在旋轉nx.draw命令。有沒有什麼辦法可以監控圖形生成的距離?

回答

3

Networkx真的不適合這項任務。它非常緩慢。 另外,matplotlib(nx.draw)永遠不會成功繪製那麼多的對象。

如果您想要可視化,您將需要一個工具來查看佈局的每個步驟,以便您可以修改發生了什麼。

即使它是越野車,我會爲此推薦Gephi。適用於大圖的唯一佈局算法是OpenOrd(Gephi插件)。不要忘記在運行算法時不要顯示邊緣。

作爲一個通用庫來處理您的圖的規模,我會推薦graph-tool。有了C++後端和python接口,它比networkx快得多。繪圖也更好。

最後,當您達到一百萬個節點規模時,您可以切換到大型圖形分析框架,如Graphlab-CreateApache GraphX

+0

我接受了你的建議,並繼續在GraphX中試用它。我不知道太多的Scala或火花(但),但是我能夠製作圖形並計算適當的邊數和頂點數。絕對是一個學習曲線,但它的工作原理!謝謝! –

+0

有一個python API。你並不需要使用Scala。 Spark是機器學習和大數據分析的重要資產。我用它很容易處理十億個邊緣的圖形:) – Kikohs

+0

它的確如此,但是pyspark還不支持GraphX。因此,斯卡拉。 –

2

Networkx'draw確實需要很長時間。但是,它不是通過Networkx提供的唯一佈局/繪圖功能,而且圖形也不是那麼大。

您可以嘗試draw_graphviz,其中networkx.draw_graphviz(G, 'dot')networkx.draw_graphviz(G, 'neato')(其中G是您的networkx圖)。

此調用將使用graphviz作爲節點佈局,matplotlib作爲實際繪圖。因此,你最好也確保了機器graphviz安裝(sudo apt-get install graphvizsudo pip install pygraphviz,假設你正在運行一個基於Debian的操作系統,其中aptpip可用)

爲了什麼dotneato的解釋是說請參閱的graphviz的網站。這些是Graphviz提供的處理圖形繪製(以及可以在命令行調用)的兩個軟件(以及其他軟件)。我曾親自在亞馬遜的EC2上使用它們,並且節點佈局似乎需要一些時間,但它們會產生輸出。

在監控整個過程中,您可以從(其他)終端發出top命令,並檢查過程正在做什麼,但會回答簡單的問題,如「過程是否停止?」,「是否保持消費記憶?「和「它使用這個實例的CPU時間百分比是多少?」,它不會回答諸如「圖表的百分比已經佈置和繪製到目前爲止」等問題。有關top的更多信息,請參閱this link

希望這會有所幫助。