2013-03-05 61 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:如果有人知道更好的技术,请告诉我。