4

我有一个数据集,它是一个代表网络的 csv/txt 文件。文件中的每一行包含两个用逗号分隔的节点名称。我的数据文件联系了大约 330k 个节点和大约 550k 个边。我正在尝试使用以下代码创建一个非常基本的图表(是的,我知道它会非常混乱):

import networkx as nx
import matplotlib.pyplot as plt
import sys
import numpy as np

f = open('dataFile.txt', 'rb')
G = nx.read_edgelist(f, delimiter=',', nodetype=str)
f.close()

print(nx.number_of_nodes(G))
print(nx.number_of_edges(G))

plt.figure(1)
nx.draw(G)
plt.savefig("graph.pdf")

我在 AWS EC2 m4.4xlarge 实例上运行它,它与 100% 的 CPU 和只有 1% 的内存挂钩。

我对此持怀疑态度,因为我认为 networkx 是内存密集型的,而不是 CPU 占用。现在,它正在运行 nx.draw 命令。有什么方法可以监控它的图形生成有多远?

4

2 回答 2

6

Networkx 确实不适合这项任务。它非常慢。此外,matplotlib (nx.draw) 永远不会成功绘制那么多对象。

如果您想可视化,您将需要一个工具来查看布局的每个步骤,您可以在其中修改正在发生的事情。

即使它是越野车,我也会为此推荐Gephi。唯一适用于大图的布局算法是OpenOrd(Gephi 插件)。不要忘记在运行算法时不要显示边缘。

作为处理图形比例的通用库,我建议使用graph-tool。使用 C++ 后端和 python 接口,它比 networkx 快得多。绘图也更好。

最后,当您达到一百万个节点规模时,您可以切换到大型图形分析框架,例如Graphlab-CreateApache GraphX

于 2015-12-09T08:20:53.513 回答
3

Networkx'draw确实需要很长时间。但是,它不是 Networkx 提供的唯一布局/绘图功能,而且您的图表也不是那么大。

您可以尝试使用简单的draw_graphviznetworkx.draw_graphviz(G, 'dot')networkx.draw_graphviz(G, 'neato')G您的 networkx 图在哪里)。

此调用将使用 graphviz 进行节点布局,使用matplotlib进行实际绘图。因此,您最好还确保机器安装了graphvizsudo apt-get install graphviz, sudo pip install pygraphviz,假设您正在运行基于 Debian 的操作系统apt并且pip可用)

有关含义dotneato含义的解释,请参阅 graphviz 的网站。这是 graphviz 提供的两个软件(以及其他软件),它们处理图形的绘制(它们可以在命令行中调用)。我个人在 Amazon 的 EC2 上将它们与数十万条边一起使用,虽然节点布局可能看起来需要一些时间,但它们会产生输出。

在监视整个过程方面,您可以从(另一个)终端发出top命令并检查进程正在做什么,但这会回答简单的问题,例如“进程是否停止?”,“它是否一直在消耗内存?” 和“它在这个实例中使用了多少百分比的 CPU 时间?”,它不会回答诸如“到目前为止已经布置和绘制了多少百分比的图形?”之类的问题。有关更多信息,top请参阅此链接

希望这可以帮助。

于 2015-12-09T11:45:14.910 回答