1

在Python 2.7上使用Networkx,我一直在试图建立一个约2M用户和880M边缘的图。我正在使用包含边缘列表的大约17Gb的文本文件。 我试过使用函数nx.read_edgelist(),但使用大约250Gb或RAM(我正在远程服务器上工作)后,我的程序被杀害。为什么Networkx会占用我所有的内存?

我的问题是:networkx使用那么多内存是否正常?或者,也许我收集数据时出错了? 我一直在考虑使用另一个库,我发现这两个iGraph和图形工具看起来非常有效。有人会有任何建议吗?

谢谢!

编辑:我的文件实际上包含880M的边缘,而不是88M

+0

科拉斯嗨固定 - 我给了一个答案,但不是100%肯定它是正确的。通常我会使用评论,但这太长了。如果解决这个问题(或不解决问题),请让我知道,以便我可以适当地编辑/删除我的答案。 – Joel

+0

您好,Joel,非常感谢您的回答! 我目前正在尝试你的解决方案,当然我会让你更新(计算通常需要很长时间,我可能会在星期一给你一个结果)。 然而,我应该纠正我自己的问题:我实际上处理880M边缘(我在阅读时跳过了0),这可能解释我的困难... –

回答

0

(我不是100%肯定这一点,但没有其他人已经回答了,所以我给它一个GO)。

首先,每个边缘被保存两次(每个节点一次),因此内存可以快速增长。但是,这可能不是你最大的问题

它很可能是你的节点名称都是整数。但是,如果您没有告知read_edgelist他们是整数,他们将被视为字符串。与int相比,用于字符串的内存是巨大的。下面是如何调用read_edgelist

read_edgelist(path, comments='#', delimiter=None, create_using=None, nodetype=None, data=True, edgetype=None, encoding='utf-8') 

如果这是你的问题,它会通过使用

G=nx.read_edgelist(path, nodetype = int) 
+0

非常感谢您的答案,但不幸的是,这并没有解决问题(我的图形对象仍然使用超过250GB的数据)。我认为实际上没有图书馆能够处理这样一个巨大的图表,因此我将直接处理边界列表,大多数操作仍然可能以这种方式进行,尽管更复杂。 –

相关问题