python-igraph多处理任务
我正在使用pythonigraph完成我的任务。比方说,我们有一个大的加权有向图,对于每个节点,如果它的权重是重要的(例如,top-n by-weight),我们想用一个特殊的标志(向它添加一个属性)来标记它的边。显然,这个操作可以并行完成,因为它对于每个节点都是独立的。所以我决定使用多重处理。但我似乎做错了什么,因为图表是不变的。一个流程版本可以工作 这是一本书。我的做法是:python-igraph多处理任务,python,multiprocessing,igraph,Python,Multiprocessing,Igraph,我正在使用pythonigraph完成我的任务。比方说,我们有一个大的加权有向图,对于每个节点,如果它的权重是重要的(例如,top-n by-weight),我们想用一个特殊的标志(向它添加一个属性)来标记它的边。显然,这个操作可以并行完成,因为它对于每个节点都是独立的。所以我决定使用多重处理。但我似乎做错了什么,因为图表是不变的。一个流程版本可以工作 这是一本书。我的做法是: from argparse import ArgumentParser from igraph import Grap
from argparse import ArgumentParser
from igraph import Graph
from enum import Enum
import multiprocessing as mp
MAXIMUM_PARALLEL_PROCESSES = 4
class EdgeType(Enum):
Distance = 0
ListOfNeighbors = 1
class ClustGraph():
def __init__(self):
self.__graph = None
def create_short_graph(self):
graph = self.__graph
print graph.es[0]
queue = mp.JoinableQueue()
[queue.put(vertex.index) for vertex in graph.vs]
[queue.put(None) for i in range(MAXIMUM_PARALLEL_PROCESSES)]
workers = []
for i in range(MAXIMUM_PARALLEL_PROCESSES):
worker = mp.Process(target=ClustGraph.__create_neighbors_list_parallel, args=(self, queue))
workers.append(worker)
worker.start()
queue.join()
print graph.es[0]
def load(self, f):
self.__graph = Graph.Read_Ncol(f)
self.__graph.es['type'] = [{EdgeType.Distance} for i in xrange(len(self.__graph.es))]
@staticmethod
def __create_neighbors_list(vertex, graph, p, n):
edges = graph.es.select(_from=vertex)
size = int(max(len(edges) * p, n))
short_edges = dict(sorted([(edge, edge['weight']) for edge in edges], key=lambda (k, v): v, reverse=True)[:size]).keys()
[e['type'].add(EdgeType.ListOfNeighbors) for e in short_edges]
def __create_neighbors_list_parallel(self, queue, p=0.05, n=7):
while True:
vertex = queue.get()
if vertex is None:
break
ClustGraph.__create_neighbors_list(vertex, self.__graph, p, n)
queue.task_done()
queue.task_done()
def main():
parser = ArgumentParser()
parser.add_argument('-i', '--input')
args = parser.parse_args()
graph = ClustGraph()
graph.load(args.input)
graph.create_short_graph()
if __name__ == '__main__':
main()
然而,如果有任何关于这类任务的最佳实践,我将很高兴了解它们
另外,enum是我已经意识到,问题实际上是同步。因此,问题是-是否有可能以多处理方式使用python igraph?我怀疑内存中初始图形的副本数量与您已启动的工作进程的数量相同(即,每个工作进程都有自己的图形副本,然后在副本上工作)。您可能可以使用
multiprocessing.Pipe
对象将邻居列表发送回产生工作进程的主进程,然后只需在主进程中更新图形即可。