Rubyで簡単にバッチ処理の並列化を行う

研究のプログラムで, さくっと結果出したいけど, パラメータのチューニングも面倒なので, 適当に指定したパラメータの組み合わせを与えて, プログラムを回したいことは結構多いと思う.

その時に同じプログラムに異なるパラメータを投げて, そのバッチ実行を並列化したい, ということをRubyだと簡単にできるので紹介. ちなみに動作環境は, Mac OS X Mavericksで, Rubyは2.1.3を利用している.

#!/usr/bin/env ruby

require 'rubygems'
require 'parallel'

num_process = 4


ps1 = [1, 2, 3]
ps2 = [2, 3, 4]
ps3 = [3, 4, 5]

Parallel.each(ps1.product(ps2, ps3), :in_processes => num_thread) do |e|
  p1 = e[0]
  p2 = e[1]
  p3 = e[2]

  cmd = "./hoge #{p1} #{p2} #{p3}"
  system cmd
end

ポイントは, Parallel#eachに渡す配列をArray#productメソッドを用いて組み合わせを生成しているところで, こうすると, ps1, ps2, ps3のパラメータの組み合わせを簡単に列挙できる.