我在使用并行版本的map(ppmap包装器,由Kirk Strauser实现(时遇到了一些麻烦。
我尝试并行运行的函数对大量字符串(蛋白质序列(运行简单的正则表达式搜索,这些字符串是使用 BioPython 的 SeqIO 从文件系统中解析的。每个函数调用都使用自己的文件。
如果我使用法线贴图运行函数,一切都按预期工作。但是,当使用ppmap时,一些运行只是冻结,没有CPU使用率,主程序甚至没有对键盘中断做出反应。此外,当我查看正在运行的进程时,工作线程仍然存在(但不再使用任何 CPU(。
例如
/usr/bin/python -u /usr/local/lib/python2.7/dist-packages/pp-1.6.1-py2.7.egg/ppworker.py 2>/dev/null
此外,工人似乎不会冻结任何特定的数据输入 - 如果我手动终止进程并重新运行执行,它会在不同的点停止。(所以我暂时保留了已完成条目的列表并多次重新启动程序(。
有什么办法可以查看问题出在哪里?
我正在运行的代码示例:
def analyse_repeats(data):
"""
Loads whole proteome in memory and then looks for repeats in sequences,
flags both real repeats and sequences not containing particular aminoacid
"""
(organism, organism_id, filename) = data
import re
letters = ['C','M','F','I','L','V','W','Y','A','G','T','S','Q','N','E','D','H','R','K','P']
try:
handle = open(filename)
data = Bio.SeqIO.parse(handle, "fasta")
records = [record for record in data]
store_records = []
for record in records:
sequence = str(record.seq)
uniprot_id = str(record.name)
for letter in letters:
items = set(re.compile("(%s+)" % tuple(([letter] * 1))).findall(sequence))
if items:
for item in items:
store_records.append((organism_id,len(item), uniprot_id, letter))
else:
# letter not present in the string, "zero" repeat
store_records.append((organism_id,0, uniprot_id, letter))
handle.close()
return (organism,store_records)
except IOError as e:
print e
return (organism, [])
res_generator = ppmap.ppmap(
None,
analyse_repeats,
zip(todo_list, organism_ids, filenames)
)
for res in res_generator:
# process the output
如果我使用简单的地图而不是 ppmap,一切正常:
res_generator = map(
analyse_repeats,
zip(todo_list, organism_ids, filenames)
)
您可以尝试使用 multiprocessing
模块中 Pool
对象的方法之一(如 map
(。优点是它是内置的,不需要外部包。它也很好用。
默认情况下,它使用与计算机具有的内核一样多的工作进程,但您也可以指定更大的数字。
我可以建议使用dispy(http://dispy.sourceforge.net(吗?免责声明:我是作者。我知道它没有直接解决问题,但希望对您有所帮助。