snowfallパッケージを使って、並列処理をやってみた

並列計算用のsnowパッケージをより簡単に使えるようにしたパッケージで、結構前からあったっぽい。私はたまたま最近R-bloggersに上がった記事を見て知りました。このパッケージを使うとsfApply(snowfall Applyの略っぽい)等の関数を用いる事でR言語に元々ある関数でいうapply関数等を並列に実行してくれる。

パッケージはいつものように

install.packages("snowfall")

でインストール。

以下簡単なサンプル

library (snowfall)
#クラスタの初期化(cpusはコア数)
sfInit(parallel = TRUE, cpus = 4)

#並列計算可能かチェック
if( sfParallel() ){
  cat("並列計算可能です。", sfCpus(), "ノードで計算します.\n" )
}else{
  cat("並列計算されません。.\n" )
}

#お試しの計算(1000データの回帰を1000回実施)
f <- function(i){
  x <- 1:1000
  y <- x + rnorm(1000)
  lm(y~x)
}
system.time(sfLapply( 1:1000, f))
system.time(lapply  ( 1:1000, f))

#クラスタの停止
sfStop ()

実行結果だけ抜粋すると

> system.time(sfLapply( 1:1000, f))
   ユーザ   システム       経過  
      7.21       0.81      11.86 
> system.time(lapply  ( 1:1000, f))
   ユーザ   システム       経過  
      6.71       0.00       6.79 

あ、あれ?これを使うと普通にやるより寧ろ遅くなってる・・・なんでだろう、よくわからん。

クラスターマシンの操作(データ転送等)ができる関数も用意されてるっぽいけど、手元に環境がないんで諦め。ちなみにこれとは別にdoSNOWパッケージなんて並列化用のパッケージもあって、それに関しては昔調べたので興味があればforeach+doSNOWパッケージを使って、並列処理をやってみた - My Life as a Mock Quantを参照してください。

【参考】