使用外部程序进行多处理 - 执行速度

时间:2014-09-01 00:05:27

标签: python c multiprocessing

我需要在数据上运行相对较慢的外部程序几百万次。该外部程序称为RNAup,一种用于确定两个RNA之间结合能的程序。在许多情况下,每个RNA-RNA对需要长达10到15分钟。这对于几百万行数据顺序运行来说太慢了,所以我决定通过尽可能并行地运行程序来加速这个过程。但是,它仍然太慢了。以下是我如何并行使用它:

import subprocess
import multiprocessing as mult
import uuid

def energy(seq, name):
    for item in seq:
        item.append([]) # adding new list to house the energy information

        stdin = open("stdin" + name + ".in", "w")
        stdin.write(item)
        stdin.close()
        stdin = open("stdin" + name + ".in", "r") # bug: this line is required to prevent bizarre results. maybe to slow down something? time.sleep()ing is no good, you must access this specific file for some reason!
        stdout = open("stdout" + name + "out", "w")

        subprocess.call("RNAup < stdin" + name + ".in > stdout" + name + ".out", shell=True) # RNAup call slightly modified for brevity and clarity of understanding
        stdout.close()

        stdout = open("stdout" + name + ".out", "r")
        for line in stdout:
            item[-1].append(line)
        stdout.close()
    return seq

def intermediate(seq):
    name = str(uuid.uuid4()) # give each item in the array a different ID on disk so as to not have to bother with mutexes or any kind of name collisions
    energy(seq, name)

PROCESS_COUNT = mult.cpu_count() * 20 # 4 CPUs, so 80 processes running at any given time
mult.Pool(processes=PROCESS_COUNT).map(intermediate, list_nucleotide_seqs)

如何显着提高程序的速度? (顺便说一句,我会接受将部分,大部分或全部程序转移到C的答案。)现在,需要半年才能完成我的所有数据,这是完全不可接受的,我需要一些使我的程序更快的方法。

1 个答案:

答案 0 :(得分:1)

如果输入文件中的每一行RNAup真的需要10-15分钟,那么你在这里做的并不多。 是瓶颈,而不是Python代码。在所有可用内核中传播RNAup的工作是最好的方法,只需一台机器就可以加快速度,最多这意味着你的速度将提高4倍(假设有4个CPU内核)。但是如果你有100万双,你仍然会看10分钟×250,000套。假设你不能让RNAup更快,听起来你需要使用Celery或其他一些分布式框架在多台机器上分发这项工作。