我有一个数据集,它是代表网络的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命令上旋转。有什么方法可以监控图形生成的距离吗?
答案 0 :(得分:3)
Networkx真的不适合这项任务。这很慢。 另外,matplotlib(nx.draw)永远不会成功绘制那么多对象。
如果您想要可视化,则需要一个工具来查看布局的每个步骤,您可以在其中修改正在进行的操作。
即使它有问题,我也会建议Gephi。适用于大型图形的唯一布局算法是OpenOrd(Gephi插件)。不要忘记在运行算法时不显示边缘。
作为处理图表比例的通用库,我建议使用graph-tool。使用C ++后端和python接口,它比networkx快得多。绘图也更好。
最后,当您达到一百万个节点规模时,您可以切换到大型图表分析框架,例如Graphlab-Create或Apache GraphX。
答案 1 :(得分:2)
Networkx' draw
确实需要很长时间。但是,它不是Networkx提供的唯一布局/绘图功能,而且您的图表不是那么大。
您可以尝试使用networkx.draw_graphviz(G, 'dot')
或networkx.draw_graphviz(G, 'neato')
之类的简单draw_graphviz(其中G
是您的网络x图)。
此调用将使用graphviz作为节点布局,使用matplotlib作为实际绘图。因此,您最好还确保机器已安装graphviz(sudo apt-get install graphviz
,sudo pip install pygraphviz
,假设您运行的是基于Debian的操作系统apt
和{{1}可用)
有关pip
和dot
的含义的解释,请参阅graphviz的网站。这些是由graphviz提供的两个软件(以及其他软件),它们处理图形的绘制(它们可以在命令行中调用)。我亲自在亚马逊的EC2上使用它们成千上万的边缘,虽然节点布局可能需要一些时间,但它们会产生输出。
在监控整个过程方面,您可以从(另一个)终端发出neato
命令并检查过程正在进行什么,但这样可以回答简单的问题,例如"过程是否停止?","是否继续消耗内存?"和"它在这个实例中使用了多长时间的CPU时间?"它不会回答诸如&#34之类的问题;到目前为止已经绘制和绘制了多少百分比的图表?&# 34 ;.有关top
的详情,请参阅this link。
希望这有帮助。