どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

.NETのParallel.For的な処理をbashで


はじめに

「.NETやopenMPのparallel for的な処理をbashでやりたい」という状況が生じたのでメモ.
方法を簡単に言うと,xargsにseqでループカウンタを渡して,各処理をパラレルに処理する.
※xargsによる並列処理については以前に書いた*1

やりかた

$ seq [カウンタ開始値] [カウンタ終了値] | xargs -P[並列数] -Ix bash -c '[具体的な処理]'

seqでループカウンタを生成して*2,それをxargsに渡して処理する.
ただし,各処理におけるループカウンタ値はxで参照する*3

これは,C#(.NET)における次のようなコードと対応する.

Parallel.For([カウンタ開始値], [カウンタ終了値], new ParallelOptions() {MaxDegreeOfParallelism = [並列数]}, x => [具体的な処理])

具体例

$ seq 1 10 | xargs -P8 -Ix bash -c 'echo x'

実行結果は次のようになる.

3
1
2
4
5
6
7
8
9
10

ただし,結果の出力順序は毎回変化する.
これは,xargsにおける並列処理の終了順序に依存するためである.

*1:http://d.hatena.ne.jp/ni66ling/20140122/1390378406

*2:ここでは$ seq [カウンタ開始値] [カウンタ終了値]としているが,$ seq [カウンタ開始値] [カウンタ増加値] [カウンタ終了値]としてカウンタ増加値を設定することもできる.

*3:パラメタ-Ixにて,入力をxで参照することを宣言したため.-I{}とすることが多い.