优化Python NetworkX中的内存使用

1 投票
1 回答
1736 浏览
提问于 2025-04-17 17:58

我正在分析一个博客网络,想要制作一个标签网络(也就是在共享相同标签的博客之间建立连接,连接的权重是共享标签的数量除以任一博客的总标签数)。这个图大约有10000个节点。我需要把原始数据转换成GraphML格式,为此我在使用python的networkx库。但是我的电脑内存不够了。我对python还不太熟悉,能不能请大家告诉我我哪里做错了?(或者这是硬件问题吗?我的系统是i3,内存3GB)

#!/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')

1 个回答

0

我能想到的唯一改进是,不用为标签创建一个二维列表,而是可以为每个标签使用一个二进制标志位。这样做的好处是占用的内存更少(因为标签可能很长,而且不同的标签大约只有150个,所以会有很多重复)。不过,这样的改变并不会有太大影响。问题出在像Aric在评论中提到的write_graphml函数上。我最终在一台16GB的机器上运行了这个函数,结果占用了大约9.5GB的内存。
另外,如果有人知道更好的方法,请告诉我。

撰写回答