Я делаю сложный расчет в networkx. Расчет включает в себя расчет некоторого количества снова и снова для каждого узла в сети. В качестве примера такого расчета предположим, что мы хотим вычислить среднюю степень соседей каждого узла в сети и сохранить это значение как атрибут узла. Следующий фрагмент работает для меня:
import networkx as nx
G = nx.erdos_renyi_graph(10, 0.5)
def ave_nbr_deg(node):
value = 0.
for nbr in G.neighbors(node):
value += G.degree(nbr)
G.node[node]['ave_nbr_deg'] = value/len(G.neighbors(node))
for node in G.nodes():
ave_nbr_deg(node)
print G.nodes(data = True)
Это дает мне:
[(0, {'ave_nbr_deg': 5.4}), (1, {'ave_nbr_deg': 5.0}), (2, {'ave_nbr_deg': 5.333333333333333}), (3, {'ave_nbr_deg': 5.2}), (4, {'ave_nbr_deg': 5.6}), (5, {'ave_nbr_deg': 5.6}), (6, {'ave_nbr_deg': 5.2}), (7, {'ave_nbr_deg': 5.25}), (8, {'ave_nbr_deg': 5.5}), (9, {'ave_nbr_deg': 5.5})]
Вот сам у меня есть небольшое сомнение. Объект G создается вне функции ave_nbr_deg
, и я понятия не имею, откуда у функции информация, хотя я и не объявлял ее глобальной.
Теперь я хочу использовать параллельный модуль Python, чтобы использовать все ядра в моей системе для этого расчета. После внесения некоторых изменений в приведенный выше код я получаю следующий код:
import networkx as nx
import pp
G = nx.erdos_renyi_graph(10, 0.5)
def ave_nbr_deg(node):
value = 0.
for nbr in G.neighbors(node):
value += G.degree(nbr)
G.node[node]['ave_nbr_deg'] = value/len(G.neighbors(node))
job_server = pp.Server(ppservers = ())
print "Starting pp with", job_server.get_ncpus(), "workers"
for node in G.nodes():
job_server.submit(ave_nbr_deg, args = (node,))()
print G.nodes(data = True)
Но он возвращает следующую ошибку:
An error has occured during the function execution
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/ppworker.py", line 90, in run
__result = __f(*__args)
File "<string>", line 5, in ave_nbr_deg
NameError: global name 'G' is not defined
Я пробовал всевозможные вещи, включая имя модуля nx
в отправке и так далее. Однако я не понимаю, в чем именно проблема. К сожалению, документация по smp слишком короткий, чтобы решить эту проблему. Я был бы очень признателен, если бы кто-нибудь здесь мог помочь мне с этим.
заранее спасибо