kuroの覚え書き

96の個人的覚え書き

並列化

現在のところ処理したいファイルが多数あり、それを同時進行で一気に処理を進める方向で並列化を設定している。
つまり、QC→トリミング→マッピングという流れを実験1〜nまで同時並行で実施するスクリプトを書いている。
実験をcsvファイルの表にしておき、表に載っているファイルを一気に処理にかけるというスタイル。

これ、場合によってはマシンに相当の負荷がかかるのね。というのも同時進行してるとだいたい同じタイミングで負荷のかかる処理が始まってしまうから。(これで何度かクラスタマシンをクラッシュさせてしまった・・・)

なので、同時進行で多数の実験を処理するより、一つの実験の処理を並列処理によって高速化したほうが小規模な計算機には向いている、と今更ながらに気がつく。しかしこの場合のジョブアレイの処理方法がいまいちわからない。qsubで-t 1-16のようにオプションを付けるか、qsubで投げるスクリプト内に#$ -t 1-16のように書いておけばいいのだけど、qsubで投げるスクリプトから呼び出される子スクリプト内で並列処理をしたい場合、どうすればいいのだろうか?それは無理なのかな?

http://d-nishiyama.hatenablog.com/entry/2013/06/29/170848

ここにあるように子シェルにバックグラウンドで処理させてwaitで待ってればいいのかな?


追記
並列化が有効なところはやはりマッピング等、普通にやってて時間がかかる部分なので、そこにアレイジョブを持ってくるのが良いだろうという意見を頂いた。確かにその通りなので、ちょっとスクリプトを見直すことにする。

これまではqsub投入スクリプトでアレイジョブとしてcsvにリストされた実験をIDごとにジョブとして起こして並列にパイプライン処理を行うものだった。
改変後はcsvから1実験だけを変数指定で読み取り、パイプラインにかける。その中で最も時間のかかるマッピングの部分でアレイジョブによる並列処理を利用し、その他の圧縮、インデックス作成等の比較的短時間で終わる処理は、バックグラウンドジョブを使ってCPUを分散させて並列化する。