2015-12-09 3 views
1

У меня есть набор данных, представляющий собой файл csv/txt, представляющий сеть. Каждая строка в файле содержит два имени узла, разделенных запятой. Мой файл данных имеет контакты около 330 тыс. Узлов и около 550 тыс. Краев. Я пытаюсь создать только очень элементарный график этого (да, я знаю, что это будет очень суматоху), используя следующий код:Как отслеживать состояние создания диаграммы networkx?

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") 

Я бегу это на m4.4xlarge например AWS EC2 и это pegging на 100% процессоров и только 1% памяти.

Я скептически отношусь к этому, так как я думал, что networkx имеет интенсивную память, а не процессор. Прямо сейчас он вращается по команде nx.draw. Есть ли способ отслеживать, насколько далеко он находится в генерации графиков?

ответ

3

Networkx действительно не подходит для выполнения задачи. Это очень медленно. Кроме того, matplotlib (nx.draw) никогда не сможет нарисовать много объектов.

Если вы хотите визуализировать, вам понадобится инструмент, чтобы увидеть каждый шаг макета, где вы могли бы изменить то, что происходит.

Даже если это багги, я бы порекомендовал Gephi для этого. Единственный алгоритм компоновки, который работает для больших графиков, - OpenOrd (плагины Gephi). Не забудьте не показывать края при запуске алгоритма.

В качестве библиотеки общего назначения для обработки шкалы графиков я бы рекомендовал graph-tool. С бэкэдом C++ и интерфейсом python он намного быстрее, чем networkx. Рисунок также лучше.

Наконец, когда вы достигаете миллионного шкалы узлов, вы можете переключиться на большие рамки графической аналитики, такие как Graphlab-Create или Apache GraphX.

+0

Я принял ваш совет и пошел дальше, чтобы попробовать его в GraphX. Я не знаю много scala или искры (пока), но я смог сделать график и подсчитал соответствующее количество ребер и вершин. Определенно кривая обучения, но она работает! Спасибо! –

+0

Существует API-интерфейс python. Вам не нужно использовать Scala. Spark - отличный инструмент для машинного обучения и большой аналитики данных. Я легко обрабатываю граф миллиардов краев :) – Kikohs

+0

Его правда, но pyspark еще не поддерживает GraphX. Следовательно, scala. –

2

Networkx 'draw действительно займет много времени. Тем не менее, это не единственная функция макета/чертежа, доступная через Networkx, и ваш график не такой большой.

Вы можете попробовать draw_graphviz с чем-то же просто, как networkx.draw_graphviz(G, 'dot') или networkx.draw_graphviz(G, 'neato') (где G ваш NetworkX график).

Этот вызов будет использовать graphviz для макета узла и matplotlib для фактического чертежа. Таким образом, вы лучше и убедитесь, что машина graphviz установлен (sudo apt-get install graphviz, sudo pip install pygraphviz, если вы работаете в на основе Debian операционной системы, в которой apt и pip доступны)

Для объяснения того, что dot и neato означают см GraphViz годов Веб-сайт. Это две части программного обеспечения (вместе с другими), предоставляемые graphviz, которые обрабатывают рисование графиков (и их можно вызвать в командной строке). Я лично использовал их с сотнями тысяч ребер на EC2 Amazon, и, хотя компоновка узлов может занять некоторое время, они будут производить вывод.

Что касается мониторинга всего процесса, вы можете отправить команду top с терминала (ноте) и проверить, что делает этот процесс, но это будет отвечать на простые вопросы, такие как «Остановил ли процесс?», «Это сохранить память? " и «Какой процент от времени процессора использует этот экземпляр правильно?», он не будет отвечать на такие вопросы, как «Какой процент графика был вычислен и сделан до сих пор?».Для получения дополнительной информации о top см. this link.

Надеюсь, это поможет.

Смежные вопросы