2011-11-24 60 views
3

我做了一個代碼,用於生成379613734邊的圖。代碼運行時的內存問題(Python,Networkx)

但由於內存原因代碼無法完成。當它通過6200萬線時,它佔用了大約97%的服務器內存。所以我殺了它。

你有什麼想法來解決這個問題嗎?

我的代碼是這樣的:

import os, sys 
import time 
import networkx as nx 


G = nx.Graph() 

ptime = time.time() 
j = 1 

for line in open("./US_Health_Links.txt", 'r'): 
#for line in open("./test_network.txt", 'r'): 
    follower = line.strip().split()[0] 
    followee = line.strip().split()[1] 

    G.add_edge(follower, followee) 

    if j%1000000 == 0: 
     print j*1.0/1000000, "million lines done", time.time() - ptime 
     ptime = time.time() 
    j += 1 

DG = G.to_directed() 
#  P = nx.path_graph(DG) 
Nn_G = G.number_of_nodes() 
N_CC = nx.number_connected_components(G) 
LCC = nx.connected_component_subgraphs(G)[0] 
n_LCC = LCC.nodes() 
Nn_LCC = LCC.number_of_nodes() 
inDegree = DG.in_degree() 
outDegree = DG.out_degree() 
Density = nx.density(G) 
#  Diameter = nx.diameter(G) 
#  Centrality = nx.betweenness_centrality(PDG, normalized=True, weighted_edges=False) 
#  Clustering = nx.average_clustering(G) 

print "number of nodes in G\t" + str(Nn_G) + '\n' + "number of CC in G\t" + str(N_CC) + '\n' + "number of nodes in LCC\t" + str(Nn_LCC) + '\n' + "Density of G\t" + str(Density) + '\n' 
#  sys.exit() 
# j += 1 

邊緣的數據是這樣的:

1000 1001 
1000245 1020191 
1000 10267352 
1000653 10957902 
1000 11039092 
1000 1118691 
10346 11882 
1000 1228281 
1000 1247041 
1000 12965332 
121340 13027572 
1000 13075072 
1000 13183162 
1000 13250162 
1214 13326292 
1000 13452672 
1000 13844892 
1000 14061830 
12340 1406481 
1000 14134703 
1000 14216951 
1000 14254402 
12134 14258044 
1000 14270791 
1000 14278978 
12134 14313332 
1000 14392970 
1000 14441172 
1000 14497568 
1000 14502775 
1000 14595635 
1000 14620544 
1000 14632615 
10234 14680596 
1000 14956164 
10230 14998341 
112000 15132211 
1000 15145450 
100 15285998 
1000 15288974 
1000 15300187 
1000 1532061 
1000 15326300 

最後,有沒有人誰擁有的經驗來分析Twitter的鏈接數據?我很難拿出有向圖並計算平均/中值的不完整和節點的超出。任何幫助或想法?

+0

據我所知,你試圖對有向圖做什麼是毫無意義的。對'G.to_directed()'的調用不會提供任何有意義的邊緣指示,所以'DG.in_degree()'和'DG.out_degree()'正是您從G中獲得的。度()'。如果您關心的是不同點和不同點之間的差異,那麼您需要從頭開始將圖形建立爲有向圖。 –

+0

感謝您的評論。我不知道那件事。我希望查看網絡的基本統計數據,例如#CC(連接組件數量),LCC(%)(最大連接組件中的節點數),In-degree Avg(Med),Out-degree Avg(Med) ,直徑和聚類係數。這是我第一次使用networkx。所以做得很好很難。 – ooozooo

+1

networkx的教程很好,但它既不是網絡分析教程,也不是python教程;出於學習目的,從小型網絡入手肯定更容易。對於基本統計數據,嘗試類似[Pajek](http://pajek.imfm.si/doku.php)可能更容易。他們處理[大型網絡]的技巧(http://vlado.fmf.uni-lj.si/pub/networks/pajek/howto/extreme.htm)應該特別適合。 –

回答

5

首先,您應該考慮是否可以添加更多的RAM。根據您所擁有的數據進行計算,或者通過讀取各種大小的數據的子樣本來衡量內存使用情況,從而衡量內存使用情況。幾GB的RAM的適度成本可能會讓你省去很多的時間和麻煩。

其次,考慮是否需要實際構建整個圖形。例如,您可以通過遍歷文件和計算來確定頂點的數量和他們的度數 - 您只需要一次在內存中保留一行,再加上計數,這將比圖表小很多。知道度數時,可以在查找最大連通分量時從圖中省略任意一個頂點,然後更正省略節點。您正在進行數據分析,而不是實施一些通用算法:學習有關數據的簡單事情以實現更復雜的分析。

+0

+1:關於測量內存需求和購買更多RAM的好建議;關於數據分析的有趣評論。 – EOL

4

這裏有一些想法:

  1. 可以命名與整數而不是字符串的節點:這將節省內存,相比於問題的方法(使用字符串):

    follower, followee = map(int, line.split()) 
    

    事實上,對於多位數字標識符,整數使用的內存比字符串少得多。

  2. 讓程序運行即使內存已滿,爲你的操作系統會簡單地開始交換:您有大約300萬個節點,所以我想,他們可能需要的內存數GB;即使您的計算機交換,它也許能夠處理多個節點(特別是使用整數標記節點保存的內存)。

+1

感謝您的評論! – ooozooo