Kesinの知見置き場

知見を共有していきたいじゃないですか

実行に時間がかかるスクリプトを並列実行するには

linuxで実行に時間がかかるスクリプトをいくつも実行する場合、マルチコアCPUならば並列実行して時間を短縮することができます。その方法とは、

% コマンド1 & コマンド2

これだけです。&を付けると別プロセスでバックグラウンドで実行するので簡単に並列化できます。


今年の4月から大学の研究室に配属され卒業した先輩のスクリプトを動かすことになったのですが、これが非常に時間がかかる。実行すると終わるまで2〜3時間かかるのに、topコマンドで確認するとCPUは1コアしか使ってませんでした。研究室のサーバーは4コアなのに勿体無い。
Perlのスクリプトは触れたことがないのでマルチスレッドなどに書きなおすことは難しく(というかPythonを勉強中なので浮気したくない)、先輩が残したShellscriptを見ていてこれで何とかならないかと探していたらあっさりと見つかりました。

私のスクリプトは並列に実行すると端末の画面がカオスになるので結果をファイルに出力します。その場合、

% (コマンド1 > 出力ファイル1) & (コマンド2 > 出力ファイル2)

こんな感じです。
丁度スクリプトがコア数と同じ4つだったので、実行してtopコマンドの後に"1"でコアごとのCPU使用率を見ると全て100%使っていて非常に気持ちがいいです。

問題点はメモリ使用量がオーバーしないようにすることと、当たり前ですが実行時間が短いものと長いものを並列に実行してもあまり意味がないことです。本当にマルチコアを使いきるならちゃんとプログラムから変更しないとダメですね。

研究で使用するスクリプトはパラメーターだけ変更して結果を出していくことが多いかと思いますので、このような場合に有効に活用できます。毎回コマンドを打つのは大変なのでShellscriptに書いておくと楽です。