私はこのマスターリストは、シーケンスのユニークなセットを持って、次のコードにマルチプロセッシングモジュールを使ってリストを反復し、それを辞書のキーと照合する方法は?
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_lst
にmaster_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。
しかし、私はdef
とif __name__ == '__main__':
の下に何が来るべきかはっきりしていませんでした。私は、関数にどのような引数を渡すべきかについてもあまりよく分かりません。私は次のように引数を渡さず、私はダグラスからの最初のコードを試してみてくださいエラーを取得しました。
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
私は最後の数日間のためにこれを働いていると私は私の所望の出力を生成するのに成功していません。誰かが高速で実行できる代替コードを提案できたり、誰かが複数のCPUでこのコードを実行する方法を提案できれば、それはすばらしいでしょう。この問題を解決するための助けがあれば幸いです。
はあなたの時間と労力のためにあなたがそんなにmodule.Thankをマルチプロセッシングの問題を解決する方法を示すためにどうもありがとうございます。以前のスクリプトではプロファイリングを使用していましたが、正確なボトルネックを見つける方法がわかりませんでした。私が最終的に見つけたとき、それは問題のあるforループの後のif文でした。私はパンダデータフレーム(マルチプロセッシングなし)を使って別のソリューションを試しました。私はちょうど私の問題を解決するために近かったと私もあなたの答えを得た。ありがとう:)私は最近Pythonを学び始めた生物学者ですが、スクリプト作成にあなたのコメントを間違いなく統合します – rex
あなたは大歓迎です。私はあなたがバイオインフォマティクスで働いていると思って、手を貸すことに決めました。率直に言って私は、測定を行うための現実的なデータファイルがないので、マルチプロセッシングを使用していないよりも速いのかどうかは分かりません。マスターリストが各サブタスクにコピーを渡すので、マスターリストが本当に巨大な場合は、問題が発生することもあります。起動時に、各サブタスクにファイルから読み込ませることで、回避することができます。あなたの質問に答えるなら、それを受け入れることを検討してください。 _ [誰かが私の質問に答えるとどうしたらいいですか?_](http://url.com/help/someone-answers) – martineau
@rex:このマルチプロセッシングのアプローチはどんな高速ですか? – martineau