3

マップの並列バージョン ( 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)
)
4

2 に答える 2

0

dispy (http://dispy.sourceforge.net) を使用することをお勧めしますか? 免責事項: 私は著者です。質問に直接対処していないことは理解していますが、お役に立てば幸いです。

于 2012-05-01T05:40:49.130 に答える
0

代わりに、モジュールのオブジェクトのメソッドの 1 つ ( などmap) を使用してみることができます。利点は、組み込みであり、外部パッケージを必要としないことです。また、非常にうまく機能します。Poolmultiprocessing

デフォルトでは、コンピューターのコアと同じ数のワーカー プロセスが使用されますが、より多くの数を指定することもできます。

于 2012-04-28T10:47:34.237 に答える