シェルスクリプトでお手軽並列処理

大規模な分散処理をする必要はなくても、並列処理を行なって手早く結果が欲しいケースがよくある。
そんな時にシェルスクリプトを使って、お手軽に並列処理をしてみるのが便利なのではないか。

パイプ処理を活用する。

$ cat hoge.csv | python a.py | python b.py > result.csv 

a.pyやb.pyを標準入出力でデータを受け渡しするようなプログラムを作成する。
例えば、

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
for line in sys.stdin:
    row = line.split(",")
    print(",".join(row[0],row[1]))

このようにすることで、a.pyの処理中に、逐次的にb.pyのプログラムも実行することが出来る。

xargsで並列処理

$ cat data.csv | xargs -L 2 -P 4 python ./hoge.py
15
25
20
35
30

-Lで何行ずつ処理をするか指定し、-Pで何スレッドで処理するかを指定する。

data.csvは、次のようなものである。

1,2,3,4,5
2,3,4,5,6
3,4,5,6,7
4,5,6,7,8
5,6,7,8,9

また、hoge.pyは、次のように記述して、データを受け取る。

#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
for line in sys.argv[1:]:
    row = line.split(",")
    row = [int(w) for w in row]
    print(sum(row))


このようにして、短いコード数でも手軽に並列処理を行うことが出来る。