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

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实例上运行此程序,CPU利用率已到达100%,但内存使用率只有1%。这让我感到怀疑,因为我认为networkx对内存要求很高,而不是CPU。现在它在nx.draw命令上一直卡住,有没有办法监测生成图形的进度?

2个回答

7

Networkx并不适合这个任务,它非常慢。另外,matplotlib(nx.draw)永远无法成功地绘制那么多的对象。

如果您想要可视化,您需要一个工具来查看每个布局步骤,您可能可以修改正在进行的内容。

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

作为处理您的规模图表的通用库,我建议使用graph-tool。具有C++后端和Python接口,比networkx快得多。绘图也更好。

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


我采纳了你的建议并尝试在GraphX中实现。虽然我对Scala和Spark不是很熟悉,但我成功地创建了图形并计算出了适当数量的边缘和顶点。这绝对是一个学习曲线,但它有效!谢谢! - CJ Sullivan
有一个Python API。你不一定需要使用Scala。Spark是机器学习和大数据分析的重要工具。我可以轻松地处理数十亿条边的图形 :) - Kirell
没错,但是Pyspark目前还不支持GraphX。因此需要使用Scala。 - CJ Sullivan

3
Networkx的draw确实需要很长时间。但是,Networkx还提供了其他布局/绘图函数,而且你的图并不是很大。
你可以尝试使用draw_graphviz,只需使用像networkx.draw_graphviz(G, 'dot')networkx.draw_graphviz(G, 'neato')这样简单的命令(其中G是你的Networkx图)。
这个调用会使用graphviz进行节点布局,并使用matplotlib进行实际绘制。因此,你最好也要确保机器已经安装了graphviz(假设你正在运行一个基于Debian的操作系统,其中aptpip可用,则应该执行sudo apt-get install graphvizsudo pip install pygraphviz)。
关于dotneato的解释,请参见graphviz的网站。这些是由graphviz提供的两个软件(以及其他软件),用于处理图形的绘制(它们可以在命令行中调用)。我个人曾在Amazon的EC2上使用它们处理了数十万条边,虽然节点布局可能需要一些时间,但它们会产生输出。
关于监视整个过程,你可以从(另一个)终端发出top命令,并检查进程正在执行什么操作,但这只能回答简单的问题,例如“进程是否停止?”,“它是否持续消耗内存?”以及“此时它使用了CPU时间的百分比是多少?”,它无法回答诸如“图的百分之几已经被布局和绘制了?”等问题。有关top的更多信息,请参见此链接
希望这能帮到你。

1
看起来在最新版本中已经删除了draw_graphviz(问题2077)https://networkx.github.io/documentation/networkx-2.3/release/release_2.0.html - Tytire Recubans
@TytireRecubans 你总是可以将这个任务分解为a)获取布局 b)绘制节点和边缘。无论如何,你都可以更好地控制这个过程。请参见此处的示例。 - A_A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接