如何监控networkx图创建的状态?

时间:2015-12-09 04:17:58

标签: python networkx aws-ec2

我有一个数据集,它是代表网络的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命令上旋转。有什么方法可以监控图形生成的距离吗?

2 个答案:

答案 0 :(得分:3)

Networkx真的不适合这项任务。这很慢。 另外,matplotlib(nx.draw)永远不会成功绘制那么多对象。

如果您想要可视化,则需要一个工具来查看布局的每个步骤,您可以在其中修改正在进行的操作。

即使它有问题,我也会建议Gephi。适用于大型图形的唯一布局算法是OpenOrd(Gephi插件)。不要忘记在运行算法时不显示边缘。

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

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

答案 1 :(得分:2)

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

您可以尝试使用networkx.draw_graphviz(G, 'dot')networkx.draw_graphviz(G, 'neato')之类的简单draw_graphviz(其中G是您的网络x图)。

此调用将使用graphviz作为节点布局,使用matplotlib作为实际绘图。因此,您最好还确保机器已安装graphvizsudo apt-get install graphvizsudo pip install pygraphviz,假设您运行的是基于Debian的操作系统apt和{{1}可用)

有关pipdot的含义的解释,请参阅graphviz的网站。这些是由graphviz提供的两个软件(以及其他软件),它们处理图形的绘制(它们可以在命令行中调用)。我亲自在亚马逊的EC2上使用它们成千上万的边缘,虽然节点布局可能需要一些时间,但它们会产生输出。

在监控整个过程方面,您可以从(另一个)终端发出neato命令并检查过程正在进行什么,但这样可以回答简单的问题,例如"过程是否停止?","是否继续消耗内存?"和"它在这个实例中使用了多长时间的CPU时间?"它不会回答诸如&#34之类的问题;到目前为止已经绘制和绘制了多少百分比的图表?&# 34 ;.有关top的详情,请参阅this link

希望这有帮助。