我需要在数据上运行相对较慢的外部程序几百万次。该外部程序称为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的答案。)现在,需要半年才能完成我的所有数据,这是完全不可接受的,我需要一些使我的程序更快的方法。
答案 0 :(得分:1)
如果输入文件中的每一行RNAup
真的需要10-15分钟,那么你在这里做的并不多。 那是瓶颈,而不是Python代码。在所有可用内核中传播RNAup
的工作是最好的方法,只需一台机器就可以加快速度,最多这意味着你的速度将提高4倍(假设有4个CPU内核)。但是如果你有100万双,你仍然会看10分钟×250,000套。假设你不能让RNAup
更快,听起来你需要使用Celery或其他一些分布式框架在多台机器上分发这项工作。