我對有數百萬節點和數千萬條邊的大型網絡的網絡分析感興趣。我希望能夠做許多事情,比如解析來自多種格式的網絡,查找連接的組件,檢測社區,以及運行像PageRank這樣的中心度量。NetworkX有哪些可擴展性問題?
我被NetworkX吸引,因爲它有一個很好的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首席程序員
回覆我提出的NetworkX郵件列表上的這個問題,ARIC哈格伯格回答說:
在NetworkX使用的數據結構適合擴展到 大問題(例如,數據結構是一個鄰接表)。算法具有不同的縮放屬性,但您提到的一些可用(例如,PageRank,連接的組件,在邊數量上是線性的)。
此時NetworkX是純Python代碼。使用Python字典對鄰接結構 進行編碼,以犧牲內存和計算速度爲代價提供了很大的靈活性。大型圖將 佔用大量的內存,你最終會用完。
NetworkX確實使用NumPy和SciPy來計算基於線性代數的主要爲 的算法。在那種情況下,使用NumPy矩陣或稀疏矩陣將該圖表表示爲 (複製)爲鄰接矩陣。這些算法可以受益於在NumPy和SciPY中引用的遺留C和FORTRAN代碼。
看來我目前無法親自檢查源代碼。但無論如何,請考慮:80%的時間可能花費在20%的代碼中。 Mercurial主要是用Python編寫的,但我沒有聽說過一個人抱怨它的速度與Git相比,它主要是C. – delnan
是的,但我也擔心內存。 networkx中的圖形表示是一個python庫。這是否意味着我只能將較小的圖形放入內存? – conradlee