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を参照してください。
【参考】