Python多处理,将文件作为深度传递



我有一个非常可行的任务:给定ID,在图形结构中查找它,查找它指向并计算其值的均值。

我正在为此任务使用Python多处理,我有一个称为graph的对象,该对象总结了我感兴趣的属性和层次结构。

以非常幼稚的方式使用Python多处理:

processes = []
for i in range(10):
    currDataset = getOneTenthofDataset(fullDataset)
    process = multiprocessing.process(name='name', target=func1, args=(currDataset, graph))
    processes.append(process)
    process.start() 
for p in processes:              
     p.join()
def func1(dataset, graph):
    ...
    for each row of dataset query on graph, update current row accordingly
    save dataset to file (I don't need to return the splitted datasets!)

我看到计算时间几乎没有加速(我认为这可能是由于图表上的查询是排队而不是并行完成吗?(所以我所做的是

def func2(dataset, graph):
    localGraph = copy.deepcopy(graph)
    .. same code as func1 ..

这导致了一个神秘而奇怪的错误!的确,并非所有过程都正确结束,但是只有1/3至1/2的过程和每次不同的过程正确结束。避免使用深拷贝,一切正常。另一个奇怪的行为是,未达到目的的过程不会丢任何错误,它们只是停止执行,并且在DeepCopy之后不要转到指令!最后,程序终止而没有任何错误

multiprocessing需要序列化/对您传递给该功能的任何参数。如果您的数据集很大,那将是昂贵的。在分叉系统(而不是Windows!(上,您可以利用子过程获得父母内存的复制视图并跳过副本的事实。将fullDatasetgraph放置在func1可以找到它的地方,而不会将其作为参数传递,例如模块的global名称空间。由于您的示例代码已经在模块级别,因此我假设您已经完成了。用getDatasetSlice替换getOneTenthOfDataset(我当然刚刚做出了(,您很高兴去。

processes = []
for i in range(10):
    process = multiprocessing.process(name='name', target=func1, args=(i,))
    processes.append(process)
    process.start() 
for p in processes:              
     p.join()
def func1(i):
    dataset = getDatasetSlice(i)
    graph # Its already in module namespace
    ....
    for each row of dataset query on graph, update current row accordingly
    save dataset to file (I don't need to return the splitted datasets!)

相关内容

  • 没有找到相关文章

最新更新