在Python中使用多处理池启动其他程序很慢

时间:2014-10-07 08:17:35

标签: python windows performance multiprocessing pool

我的目标:

使用python中的某些函数从我的计算机上使用不同的处理器同时从许多数据文件中提取数据。我需要从1300个文件中提取数据,因此一旦提取完成,我就会希望Python开始从新文件中提取数据。从文件中提取数据完全独立于从其他文件中提取数据。这些文件的形式需要打开创建它们的程序(OrcaFlex)来提取数据。因此,从单个文件中提取数据可能非常耗时。 (我使用Windows)

我的尝试:

使用Multiprocessing.Pool()。map_async来汇集我的任务。

代码:

import multiprocessing as mp
import OrcFxAPI # Package connected to external program

arcs = [1,2,5,7,9,13]

# define a example function
def get_results(x):
    # Collects results from external program:
    model = OrcFxAPI.Model(x[0])
    c = model['line_inner_barrel'].LinkedStatistics(['Ezy-Angle'], 1,     objectExtra=OrcFxAPI.oeEndB).TimeSeriesStatistics('Ezy-Angle').Mean
    d = model['line_inner_barrel'].LinkedStatistics(['Ezy-Angle'], 1, objectExtra=OrcFxAPI.oeEndB).Query('Ezy-Angle', 'Ezy-Angle').ValueAtMax
    e = model['line_inner_barrel'].LinkedStatistics(['Ezy-Angle'], 1, objectExtra=OrcFxAPI.oeEndB).Query('Ezy-Angle', 'Ezy-Angle').ValueAtMin

# Also does many other operations for extraction of results

return [c,d,e]


if __name__ == '__main__':

    # METHOD WITH POOL - TAKES APPROX 1 HR 28 MIN
    # List of input needed for the get_results function:
    args = ((('CaseD%.3d.sim' % casenumber), arcs, 1) for casenumber in range(1,25))

    pool = mp.Pool(processes=7)
    results = pool.map_async(get_results, args)
    pool.close()
    pool.join()

    # METHOD WITH FOR-LOOP - TAKES APPROX 1 HR 10 MIN
    # List of input needed for the get_results function:
    args2 = ((('CaseD%.3d.sim' % casenumber), arcs, 1) for casenumber in range(1,25))
    for arg in args2:
        get_results(arg)

问题: 使用for循环用于缩小集(24)的较小数据文件花费1小时10分钟,而使用具有7个处理器的池花费1小时28分钟。有没有人知道为什么运行时间这么慢,并且没有接近除以7 ???

另外,有没有办法知道Multiprocessing.Pool()分配给给定进程的处理器? (换句话说,我可以让我的过程知道它正在使用哪个处理器)

非常感谢所有帮助!!

0 个答案:

没有答案