我正在閱讀一個非常大的圖表,特別是 wiki-topcats ( http://snap.stanford.edu/data/wiki-topcats.html ),雖然我可以在可接受的時間內閱讀和創建圖表:
graph = nx.read_edgelist("C:/.../wiki-topcats.txt", nodetype=int)
然后我需要提取關聯矩陣以創建線圖(這是我的目標),但是當我運行時:
C = nx.incidence_matrix(graph)
我遇到了記憶體錯誤,我找不到任何有效的方法來處理這個問題,或者可能是通過從鄰接創建關聯矩陣來解決這個問題的方法,但是由于圖形的大小,我必須使用 scipy 矩陣,例如這個鄰接矩陣作業。
A = nx.to_scipy_sparse_matrix(graph)
. 任何幫助將不勝感激。
uj5u.com熱心網友回復:
NetworkX 顯然不是為計算大圖而設計的。它的性能也不是很好(對于記憶體消耗和速度)。圖形資料庫旨在通過將圖形存盤在存盤設備上來解決這個問題。Neo4j是 Python 中可用的此類資料庫的一個示例。話雖如此,您要計算的圖形并沒有那么大,您可以嘗試使用更高效的替代 Python 庫,例如graph-tool。
假設您真的想要/需要使用 NetworkX,那么請注意,該圖需要大約 12 GiB 的 RAM,并且許多 NetworkX 函式將回傳一個完整的圖,從而導致分配了數十個 GiB 的 RAM,這完全是資源浪費。更不用說大多數機器沒有那么多記憶體。圖形檔案僅占用大約 400 MiB,緊湊的表示應該能夠以小于 100 MiB 的方式存盤在 RAM 中。因此,使用 12 GiB 需要比預期多 120 倍以上的資源。更不用說 NetworkX 需要很長時間才能填滿這樣的記憶體空間。
假設仔細選擇稀疏矩陣型別,將檔案直接加載到稀疏矩陣中效率更高。事實上,CSR 矩陣可以非常有效地存盤鄰接矩陣,而 DOK 矩陣非常低效(它需要 6 GiB 的 RAM,并且與 NetworkX 一樣慢)。
請注意np.genfromtxt(旨在加載此類檔案)在我的機器上使用 45-50 GiB 的 RAM 會變得瘋狂。這太瘋狂了,因為它實際上比嚴格需要的要大 200 倍!希望df = pd.read_table('wiki-topcats.txt', dtype=np.int32, header=None, sep=' ')Pandas 能夠使用少于 400 MiB 的空間加載檔案。基于此,您可以輕松地將資料幀轉換為 Numpy,edges = df.to_numpy()然后構建一個相對快速的 CSR 矩陣。
請注意,您可以使用 Numpy 直接構建(稀疏 CSR)關聯矩陣。一種解決方案是使用idx = np.arange(len(df), dtype=np.int32)so 為每條邊設定一個 ID。然后,您可以直接知道 1 在稀疏矩陣 (m[edges[:,0], idx]和m[edges[:,1], idx]) 中的所有位置,這應該足以構建它(小心可能由于連接到自身的節點而導致的重復)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435994.html
