我做了一个生成379613734条边的图的代码。在
但是由于内存的原因,代码无法完成。当它通过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
边缘数据如下:
^{pr2}$最后,有没有人有分析Twitter链接数据的经验?我很难用有向图来计算节点的平均/中值索引和出度。有什么帮助或想法吗?在
以下是一些想法:
您可以用整数来命名节点,而不是字符串:与问题中的方法(使用字符串)相比,这将节省内存:
事实上,对于多位数标识符,整数比字符串占用的内存少得多。
如果你的计算机有300万个内存交换的话,它可能能够处理这么多的节点(尤其是使用整数标记的节点节省的内存)。
首先,您应该考虑是否可以添加更多的RAM。对内存使用量做一些估计,要么根据你拥有的数据进行计算,要么通过读取不同大小的数据的子样本来衡量事物的规模。几GB内存的适度成本可能会为您节省大量的时间和麻烦。在
其次,考虑是否需要实际构建整个图。例如,您可以通过迭代文件并计数来确定顶点的数量及其度数-只需在内存中一次保留一行,再加上计数,这将比图形小得多。知道了度,就可以在找到最大的连通分量时从图中省略任何阶数为1的顶点,然后对省略的节点进行校正。您正在进行数据分析,而不是实现一些通用算法:学习有关数据的简单信息,以便进行更复杂的分析。在
相关问题 更多 >
编程相关推荐