0

グラフ オブジェクトを xml 表現に書き込んでいます。私のモノリシック コードはうまく機能しますが、大きなグラフでは遅すぎます。私はそれを並列化しようとしていSubElementますが、プールから戻ってきません。明らかな何かが欠けていると確信していますが、私はpythonが初めてです。

import networkx as nx
import lxml.etree as et
from multiprocessing import Pool

G = nx.petersen_graph()

# For any graph, make a node subelement with the id being the node label
def getNodeAttributes(index):
    et.SubElement(nodes, "node", attrib={'id': str(G.nodes()[index])})

# Do it with one monolithic process
network = et.Element("network", attrib={"name": "Petersen Graph"})
nodes = et.SubElement(network, "nodes")

for i in range(len(G)):
    getNodeAttributes(i)

et.dump(network)
<network name="Petersen Graph">
  <nodes>
    <node id="0"/>
    <node id="1"/>
    <node id="2"/>
    <node id="3"/>
    <node id="4"/>
    <node id="5"/>
    <node id="6"/>
    <node id="7"/>
    <node id="8"/>
    <node id="9"/>
  </nodes>
</network>
# Do it again, but with pool.map in parallel
network = et.Element("network", attrib={"name": "Petersen Graph"})
nodes = et.SubElement(network, "nodes")

pool = Pool(4)
pool.map(getNodeAttributes, range(len(G)))
pool.close()
pool.join()

et.dump(network)
<network name="Petersen Graph">
  <nodes/>
</network>
4

1 に答える 1

1

キュー ( multiprocessing.Queue) を使用して、ワーカー プロセスの結果を収集します。この質問への回答を参照してください:複数のプロセス間で結果キューを共有する

そうは言っても、XML ファイルを順番に読み取って解析する必要があり、要素ツリーが非常に大きくなるため、あなたのケースではあまり役に立ちません。しかし、試してみてください...

于 2014-09-18T17:24:52.193 に答える