Pythonで完全に接続されたグラフを並列に構築し、次のようなエッジ値のリストも取得したい:辞書形式で保存:( node1, node2 ) = edge_value
{ ( node1, node2 ) : edge_value [, ... [, ... ] ] }
これを行うには、まず、グラフと前述の辞書の2 つのglobal変数を初期化する必要があります。Gf_correlation
import networkx as nx
from multiprocessing import Pool
G = nx.Graph()
f_correlation = {}
次に、関数を作成してグラフを作成し、辞書に格納
します。( node1, node2 ) = edge_valuef_correlation
def construct_graph_parallelly(pair_with_df):
global G
global f_correlation
pair, df = pair_with_df
i, j = pair
# calculate the edge value and store it in the global variable f_correlation
f_correlation[ (i, j) ] = calculate_value(df, i, j) # this function calculate some value on the dataframe
# here i, j are node in the graph
G.add_edge(i, j, weight = f_correlation[ (i, j) ])
return f_correlation
次に、multiprocessing.Pool()-instance が作成され、その.map()-method の呼び出しが実行され、コードが同時に実行されます。
def make_all_pair_with_df(node_list, df):
all_pair_with_df = []
for i in node_list:
for j in node_list:
if i != j :
pair_with_df = (i,j),df
all_pair_with_df.append(pair_with_df)
return all_pair_with_df
node_list = ['a', 'b', 'c', 'd', 'e']
pool = Pool()
all_pair_with_df = make_all_pair_with_df(node_list, df)
f_correlation = pool.map(construct_graph_parallelly, all_pair_with_df)
pool.close()
print("DONE")
しかし、コードを実行すると、無限に実行され、「DONE」が出力されることはありません
問題の 1 つは、グローバル変数と Python マルチプロセッシングglobalで説明されている -変数の問題である可能性があります。
しかし、私の仕事では、辞書とConnected Graphをグローバルに更新する必要があります。
これを行うにはどうすればよいですか、またはこれを機能させるにはどのような変更を行う必要がありますか?