减少Python子流程的系统时间使用

减少Python子流程的系统时间使用,python,subprocess,multiprocessing,grid-computing,Python,Subprocess,Multiprocessing,Grid Computing,我有一个python脚本,它使用多处理的pool.map(…)并行运行大量计算。每个计算都由python脚本组成,该脚本设置fortran程序的输入,使用subprocess.popen(…,stdin=PIPE,stdout=PIPE,stderr=PIPE)运行程序,转储输入并读取输出。然后脚本解析输出,获取所需的数字,然后为下一次运行再次执行该操作 def main(): #Read a configuration file #do initial setup po

我有一个python脚本,它使用多处理的pool.map(…)并行运行大量计算。每个计算都由python脚本组成,该脚本设置fortran程序的输入,使用subprocess.popen(…,stdin=PIPE,stdout=PIPE,stderr=PIPE)运行程序,转储输入并读取输出。然后脚本解析输出,获取所需的数字,然后为下一次运行再次执行该操作

def main():
    #Read a configuration file
    #do initial setup
    pool = multiprocessing.Pool(processes=maxProc)
    runner = CalcRunner( things that are the same for each run )
    runNumsAndChis = pool.map( runner, xrange(startRunNum, endRunNum))
    #dump the data that makes it past a cut to disk

class CalcRunner(object):
    def __init__(self, stuff):
        #setup member variables
    def __call__(self, runNumber):
        #get parameters for this run
        params = self.getParams(runNum)
        inFileLines = []
        #write the lines of the new input file to a list
        makeInputFile(inFileLines, ... )
        process = subprocess.Popen(cmdString, bufsize=0, stdin=subprocess.PIPE, ... )
        output = proc.communicate( "".join(inFileLines) )
        #get the needed numbers from stdout
        chi2 = getChiSq(output[0])
        return [runNumber, chi2]
    ...
不管怎么说,我想谈谈这个问题的原因。我将这个脚本提交给一个网格引擎系统,将这个巨大的参数空间扫描分解为1000个12核任务(我选择12个,因为大多数网格都是12核)。当一个任务在一台12核的机器上运行时,机器大约有1/3的时间用于做系统工作,另外2/3的时间用于做用户计算,大概是设置ECIS的输入(前面提到的FORTRAN代码)、运行ECIS和解析ECIS的输出。然而,有时5个任务被发送到64核机器以利用其60个核。在这台机器上,40%的时间花在系统上,1-2%的时间花在用户上

首先,所有的系统调用都来自哪里?我试着编写一个版本的程序,每个单独的线程运行一次ECIS,并不断向它输送新的输入,它在系统中花费的时间要长得多(而且总体上比较慢),所以它看起来不像是由于所有进程的创建和删除。 其次,我该如何减少花在系统调用上的时间

据猜测,打开一个进程并继续向其发送输入的速度较慢,因为我必须关闭gfortran的输出缓冲,才能从进程中获取任何信息,其他一切都不起作用(除了修改fortran代码……这是不可能的)

在我的家用测试机上,我开发了Fedora14。网格机器上的操作系统是Red Hat的最新版本


我尝试过使用bufsize,将其设置为-1(系统默认值)、0(无缓冲)、1(逐行)和64Kb,这似乎并没有改变任何事情。

如果你真的想要提高性能,你必须考虑像C这样的低级语言,而不是python来消除开销。虽然看起来很一般,但这是事实。你应该说你正在使用哪个操作系统,这样人们就可以建议合适的工具来调查系统时间的去向。@Puciek,如果系统时间将用于I/O(无论是文件还是管道),C不会有帮助。毕竟,CPython的I/O已经由C代码完成;-)@Puciek:我的问题是,我似乎以某种方式通过系统调用将内核死锁,而不是脚本本身运行速度不够快。当它运行单线程时,脚本需要0.013秒来设置输入文件并解析输出,ECIS(通过完全优化编译)需要0.035秒来执行计算。就开销而言,我很高兴我正试图解决的只是这个系统时间混乱问题。