2013-03-05 71 views
0

我正在通過製作標籤網絡來分析博客網絡(博客之間的共享標籤的權重=共享標籤的no數量/標籤總數no中的任意一個,大約有10000個我需要將原始數據轉換爲GraphML格式,爲此目的,我使用的是python networkx,但它的內存不足,我是新的python,所以任何人都可以告訴我我做錯了什麼在這裏,(或者是一個硬件問題?我的系統是酷睿i3,3GB內存)優化python網絡中的​​內存利用率x

#!/usr/bin/env python 
import sys 
import networkx as nx 
G=nx.Graph() 
tags=[] 
for line in open(sys.argv[1]):#Each blog has all its tags in a single line 
    tags.append(set(line.split(',')))#tags are separated by comma. 
for i in xrange(len(tags)): 
    G.add_node(i+1) 
for i in xrange(len(tags)): 
    for j in xrange(i+1,len(tags)): 
     p=len(tags[i].intersection(tags[j])) 
     q=len(tags[i].union(tags[j])) 
     if p!=0 and q!=0: 
      G.add_edge(i+1,j+1,weight=float(p)/q) 
nx.write_graphml(G,sys.argv[1]+'.graphml') 
+0

有多少條邊?可能有100M。這可能會讓你超過你的記憶極限。此外,graphml編寫器可能會使用大量內存,因爲它在內部編寫數據之前會在內存中構建一個大型XML元素樹。 – Aric 2013-03-05 15:43:11

+0

最後讓它在16GB機器上工作。它花費了大約10GB的內存。 @Aric - 是的。這是write_graphml開始時內存利用率非常高的時候。 無論如何,我仍然想知道該程序是否可以以任何方式進行優化,或者是否存在可以將圖形寫入graphml/gml/gexf文件並具有更高內存效率的庫(不一定在python中) – avmohan 2013-03-06 06:33:32

回答

0

唯一的改善,我可以看到的是,而不是使標籤爲2 d名單,我可以使用二進制標誌位每個標籤,所以它的內存要求更低(因爲標籤可以很漂亮長,不同的標籤數量只有〜150,所以有很多重複)。這並沒有太大的改變。問題在於評論中提到的像Aric這樣的write_graphml函數。我終於可以在16 GB的機器上運行它,它花費了大約9.5 GB的空間。 PS:如果有人知道更好的技術,請告訴我。