代码运行中的记忆问题(Python,Networkx)

2024-06-16 11:02:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个生成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链接数据的经验?我很难用有向图来计算节点的平均/中值索引和出度。有什么帮助或想法吗?在


Tags: of代码inimportnumbertimelinenn
2条回答

以下是一些想法:

  1. 您可以用整数来命名节点,而不是字符串:与问题中的方法(使用字符串)相比,这将节省内存:

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

    事实上,对于多位数标识符,整数比字符串占用的内存少得多。

  2. 如果你的计算机有300万个内存交换的话,它可能能够处理这么多的节点(尤其是使用整数标记的节点节省的内存)。

首先,您应该考虑是否可以添加更多的RAM。对内存使用量做一些估计,要么根据你拥有的数据进行计算,要么通过读取不同大小的数据的子样本来衡量事物的规模。几GB内存的适度成本可能会为您节省大量的时间和麻烦。在

其次,考虑是否需要实际构建整个图。例如,您可以通过迭代文件并计数来确定顶点的数量及其度数-只需在内存中一次保留一行,再加上计数,这将比图形小得多。知道了度,就可以在找到最大的连通分量时从图中省略任何阶数为1的顶点,然后对省略的节点进行校正。您正在进行数据分析,而不是实现一些通用算法:学习有关数据的简单信息,以便进行更复杂的分析。在

相关问题 更多 >