2017-01-19 151 views
0

我有几百个输入文件需要传递给函数来计算一些数字,并将它们写入输出文件。该函数不返回任何值。所以,每个函数调用都是独立的。多线程/并行处理

而不是串行调用函数,我尝试了多处理,并且性能(执行时间)并不好多了。任何关于提高性能的建议都是有价值的。甚至是多处理方式去解决这个问题?

import multiprocessing as mp 
NumProcess = 4 

def Analysis(InputFile): 
    #do some calcs 
    #Write results to output file 
    #return nothing 

FileList = ['InputFile1.csv','InputFile2.csv','InputFile3.csv',....] 
pool = mp.Pool(processes=NumProcess) 
temp = [pool.apply_async(Analysis, args=(File) for File in FileList] 
output = [p.get() for p in temp] 
pool.close() 
+0

是 - 多是正确的,有简单的方法。也许你的瓶颈在别的地方。如果你至少有两个cpu核心,这应该会更好。 – jsbueno

+0

在这个清单中有一个开放parentheresis太多,虽然 – jsbueno

+0

您的算法CPU绑定或I/O绑定?如果它是I/O绑定的,那么产生多个线程/进程将不会使它变得更快,并且如果它导致硬盘驱动器的头部不得不来回寻找更多,线程/单进程案例。 –

回答

0

多处理呼叫是否可以使用?这一行有一个错误 - 因为您根本不会将File参数作为元组传递。

修正版本(注意后面的逗号,以确保参数表是一个元组):

temp = [pool.apply_async(Analysis, args=(File,)) for File in FileList] 
+0

是的,它的工作原理。对不起,我在编辑帖子时错过了尾部的逗号和括号。由于函数调用是独立的,我认为应该有一种更有效的方式来并行处理文件。 – user7443538

+0

有一个更简单的方法 - 但它不是更有效。在Python 3中,yu可以使用concurrent.futures.ProcessPoolExecutor - 但是如果这没有加速你的话,那么conucurrent.futures将不会。 – jsbueno

+0

关于如何循环遍历所有输入文件,让每个可用的处理器并行运行其中一个输入文件,您有什么建议吗?例如 - Processor1 - Analysis(InputFile1);处理器2 - 分析(InputFile2),.... – user7443538