2017-03-04 1 views
1

私はこのマスターリストは、シーケンスのユニークなセットを持って、次のコードにマルチプロセッシングモジュールを使ってリストを反復し、それを辞書のキーと照合する方法は?

infile= open(sys.argv[1], "r") 
lines = infile.readlines()[1:] 
master_lst = ["read"] 
for line in lines: 
line= line.strip().split(',') 
fourth_field = line [3] 
master_lst.append(fourth_field) 

を使用してCSVファイルから作成master_lstという名前のリストを持っています。今度は、30個の折りたたまれたFASTAファイルをループして、マスターリスト内のこれらの各シーケンスの出現回数を数えなければなりません。 30個のファイルのファイル形式は以下の通りです:発生回数をカウントするための

>AAAAAAAAAAAAAAA 
7451 
>AAAAAAAAAAAAAAAA 
4133 
>AAAAAAAAAAAAAAAAA 
2783 

が、私は30ファイルの各を通じてループし、キーと値として出現数として配列を持つ辞書を作成しました。次に、master_lstの各要素を繰り返し、前の手順で作成した辞書のキーと一致させました。一致するものがあれば、そのキーの値を新しいリスト(ind_lst)に追加しました。そうでない場合は、ind_lstに0を追加しました。そのためのコードは以下の通りです:

for file in files: 
ind_lst = [] 
if file.endswith('.fa'): 
    first = file.split(".") 
    first_field = first [0] 
    ind_lst.append(first_field) 
    fasta= open(file) 
    individual_dict= {} 
    for line in fasta: 
    line= line.strip() 
    if line == '': 
    continue 
    if line.startswith('>'): 
    header = line.lstrip('>') 
    individual_dict[header]= '' 
    else: 
    individual_dict[header] += line 
    for key in master_lst[1:]: 
    a = 0 
    if key in individual_dict.keys(): 
    a = individual_dict[key] 
    else: 
    a = 0 
    ind_lst.append(a) 

その後、私は、コードを使用してCSVファイルとind_lstmaster_lstを書くには、ここで説明:How to append a new list to an existing CSV file?

最終的な出力は次のようになります。

Read       file1  file2 so on until file 30 
AAAAAAAAAAAAAAA     7451  4456 
AAAAAAAAAAAAAAAA    4133  3624 
AAAAAAAAAAAAAAAAA    2783  7012 

小さいコードmaster_lstを使用すると、このコードは正常に機能します。しかし、master_lstのサイズが大きくなると、実行時間が長くなりすぎます。私が今作業しているmaster_lstは、35,718,501個のシーケンス(要素)を持っています。私が50シーケンスをサブセット化してコードを実行すると、スクリプトの実行に2時間かかります。したがって、35,718,501シーケンスの場合、それは永遠に完了するでしょう。

今、私はスクリプトをスピードアップする方法がわかりません。このスクリプトを短時間で実行できるようにするための改善がいくつかあるかどうかは不明です。私は16のCPUコアを持つLinuxサーバでスクリプトを実行しています。コマンドtopを使用すると、スクリプトが1つのCPUしか使用していないことがわかりました。しかし、私はPythonの専門家ではなく、マルチプロセッシングモジュールを使用して使用可能なすべてのCPUコアでどのように動作させるかわかりません。私はこのウェブページを確認した:Learning Python's Multiprocessing Module

しかし、私はdefif __name__ == '__main__':の下に何が来るべきかはっきりしていませんでした。私は、関数にどのような引数を渡すべきかについてもあまりよく分かりません。私は次のように引数を渡さず、私はダグラスからの最初のコードを試してみてくださいエラーを取得しました。

File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 

self._target(*self._args, **self._kwargs) 

私は最後の数日間のためにこれを働いていると私は私の所望の出力を生成するのに成功していません。誰かが高速で実行できる代替コードを提案できたり、誰かが複数のCPUでこのコードを実行する方法を提案できれば、それはすばらしいでしょう。この問題を解決するための助けがあれば幸いです。

答えて

1

ここにはマルチプロセッシングバージョンがあります。 ind_lstの作成の必要性を排除するコードとは少し異なるアプローチを採用しています。

この違いの本質は、最初に目的のデータの転置を生成し、それを所望の結果に転置することである。すなわち

、代わりにこれを直接作成する:

Read,file1,file2 
AAAAAAAAAAAAAAA,7451,4456 
AAAAAAAAAAAAAAAA,4133,3624 
AAAAAAAAAAAAAAAAA,2783,7012 

それは最初の生成:

Read,AAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAA,AAAAAAAAAAAAAAAAA 
file1,7451,4133,2783 
file2,4456,3624,7012 

を...そしてビルトインzip()機能と所望を得るために、その転置フォーマット。

ind_lstを作成する必要はありませんが、1列ではなくファイルごとに1行のデータを作成することもできます(簡単で手間が省け、効率的です)。ここで

はコードです:

+0

はあなたの時間と労力のためにあなたがそんなにmodule.Thankをマルチプロセッシングの問題を解決する方法を示すためにどうもありがとうございます。以前のスクリプトではプロファイリングを使用していましたが、正確なボトルネックを見つける方法がわかりませんでした。私が最終的に見つけたとき、それは問題のあるforループの後のif文でした。私はパンダデータフレーム(マルチプロセッシングなし)を使って別のソリューションを試しました。私はちょうど私の問題を解決するために近かったと私もあなたの答えを得た。ありがとう:)私は最近Pythonを学び始めた生物学者ですが、スクリプト作成にあなたのコメントを間違いなく統合します – rex

+0

あなたは大歓迎です。私はあなたがバイオインフォマティクスで働いていると思って、手を貸すことに決めました。率直に言って私は、測定を行うための現実的なデータファイルがないので、マルチプロセッシングを使用していないよりも速いのかどうかは分かりません。マスターリストが各サブタスクにコピーを渡すので、マスターリストが本当に巨大な場合は、問題が発生することもあります。起動時に、各サブタスクにファイルから読み込ませることで、回避することができます。あなたの質問に答えるなら、それを受け入れることを検討してください。 _ [誰かが私の質問に答えるとどうしたらいいですか?_](http://url.com/help/someone-answers) – martineau

+0

@rex:このマルチプロセッシングのアプローチはどんな高速ですか? – martineau

関連する問題