R の snow や snowfall パッケージを使った並列計算

並列化

R で並列計算を行う場合は、snow パッケージや snowfall パッケージを使用すると便利である。

snowfall パッケージの使い方

R の lapplysapply 関数で行われる計算を並列化するとき、snowflow パッケージ中の sfLapplysfSapply 関数を利用すると便利である。ほとんどの場合、関数名を変更するだけで、並列化することができる。snowflow パッケージには sfLapplysfSapply および sfApply 関数が実装されている。それぞれが、R 標準の lapplysapply および apply に対応している。

snowflow パッケージを使用するには、まず sfInit 関数で使用するスレッド数を指定する。次に、必要に応じて、sfExportAllsfLibrary などの関数で R 環境にある変数やライブラリー関数を並列環境に受け渡す。

library(snowfall)
calc.mse <- function(x, y) {
    (x - y)^2 / length(x)
}

x <- runif(100, 0, 20)
y <- 2 * x + 1 + rnorm(100)

label <- rep(1:5, each = 20)
label <- sample(label)

sfInit(parallel = TRUE, cpus = 4)
sfLibrary(base)
#sfLibrary(glmnet)
sfExportAll()

mse <- sfSapply(1:5, function(i) {
    x.tran <- x[label != i]
    y.tran <- y[label != i]
    x.test <- x[label == i]
    y.test <- y[label == i]
    #m <- glmnet(y.train ~ x.train)
    calc.mse(x.test, y.test)
})

sfRemoveAll()
sfStop()