xargsを使って簡単に並列処理をする方法


この記事はPepabo Advent Calendar 2015の20日目の記事です。

先日とある案件で約400万個の画像データを別のサーバーにAPI経由でインポートする必要がありました。最初は単純に直列で実行してたのですが、終了予想を調べたら約20日かかる事になりあまりに遅すぎる!!と悩んでいた所、「並列処理で実行すればいいよ」というアドバイスを頂きました。いろいろ調べて試した結果、xargsで並列処理をするのが一番簡単かつ使いやすかったので使い方をまとめます。

サンプルスクリプト

現在時刻を表示した後に1秒間sleepします。

これをxargsコマンドを利用して10回直列実行すると下記の通り10秒かかります。これは想定通りです。

-n は引数の数を指定します。

並列処理の実行方法

-P #{1度に実行したい最大プロセス数}を指定するだけです。
下記では10回の処理を5並列で実行することにより2秒で処理を終えています。倍速に!!
並列で起動させるプロセス数によっては倍速やそれ以上の速度で処理ができます。

実行中のプロセスの様子を見ると下記の通り5プロセスで処理していることが分かります。

引数も操作できる

とコマンドラインのオプションに合わせて引数を渡したい場合は下記のように-Iオプションで標準入力を中身を変数に格納し、それをコマンドラインの好きな場所で指定するだけです。

最後に

地味なお話でしたがいかがでしたでしょうか。恐らく普段のWebアプリケーション開発では使うことは無いかと思いますが、サーバー移転やデータ連携の都合で大量データを処理する必要がある場合は、並列処理を利用することで高速化を図ることが出来ます。もちろん各言語別で並列処理を実装する事もできますが、個人的にはシンプルな実装、メモリー使用量の考慮、使い勝手を考慮してxargs方式がお気に入りでした。もし機会があれば使ってみてください。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする