マップの並列バージョン ( ppmapラッパー、Kirk Strauser による実装) の使用に問題があります。
私が並行して実行しようとしている関数は、BioPython の SeqIO を使用してファイルシステムから解析された多数の文字列 (タンパク質シーケンス) に対して単純な正規表現検索を実行します。各関数呼び出しは、独自のファイルを使用します。
法線マップを使用して関数を実行すると、すべてが期待どおりに機能します。ただし、ppmap を使用すると、実行の一部が単純にフリーズし、CPU の使用率がなくなり、メイン プログラムが KeyboardInterrupt に反応しなくなります。また、実行中のプロセスを見ると、ワーカーはまだ存在しています (ただし、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)
)