4

Rの「clhs」パッケージを使用して、母集団(a、b、c、d、...以下を参照)から代表的なサンプルを抽出するつもりです。私の(マルチコア)コンピューターでは、サンプリングプロセスに非常に時間がかかるため、サンプリング手順を並行して実行したい (複数の CPU コアを同時に使用)。

これらは、サンプルを描画したい(例の)データフレーム(「母集団」)の一部です。

a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))

実行したい clhs コードは次のとおりです。

clh_a <- clhs(x=a, size=round(nrow(a)/5), iter=2000, simple=F)) # 20% of all samples should be selected
clh_b <- clhs(x=b, size=round(nrow(b)/5), iter=2000, simple=F))

等...

このサンプリング プロセスを並行して実行する方法は何ですか? または、効率的な方法でこれを行う別の方法はありますか?

補遺 (「zipfzapf」に感謝します):

私は「parLapply」を使用しようとしていました - 残念ながら、最後にRは「長さのエラー(x): 'x'がありません」というエラーメッセージをスローしていますが、これは正直わかりません...任意のアイデア?

私のコード:

    library("snow")
            a <- as.data.frame(replicate(1000, rnorm(20)))
            b <- as.data.frame(replicate(1000, rnorm(20)))
            c <- as.data.frame(replicate(1000, rnorm(20)))
    d <- as.data.frame(replicate(1000, rnorm(20)))
    abcd <- list(a, b, c, d)
    cl <- makeCluster(4)
    results <- parLapply(cl,
       X = abcd,
       FUN = function(i) {
         clhs(x = i, size = round(nrow(i) / 5), iter = 2000, simple = FALSE)
       },
    )
4

3 に答える 3

3

これは私にとってはうまくいきます(合理的なペースで物事を進めるために反復回数を変更したことに注意してください)。

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
sfLibrary(clhs)

x <- sfLapply(abcd, fun = function(x) {
            clhs(x = x, size=round(nrow(x)/5), iter = 200, simple =FALSE)
        })

     Length Class       Mode
[1,] 5      cLHS_result list
[2,] 5      cLHS_result list
[3,] 5      cLHS_result list
[4,] 5      cLHS_result list
于 2012-12-21T16:36:46.680 に答える
1

mclapply(ビルトイン) パッケージの関数parallelは、次のマルチコア バージョンですlapply

library(parallel)

# population samples
abcd <- list(a, b, c, d)

# multi-core version of 'lapply(abcd, [....])'
results <- parallel::mclapply(
  X = abcd,
  FUN = function(elem) {
    clhs(x = elem, size = round(nrow(elem) / 5), iter = 2000, simple = FALSE))
  },
  mc.preschedule = FALSE,
  mc.cores = 4L
)

これにより、各要素に対応するclhs呼び出しの結果が含まれるリストが表示されます。

引数mc.preschedulemc.coresはオプションであることに注意してください。(あなたの場合のように)の各関数呼び出しに時間がかかる場合は、に設定mc.prescheduleすることをお勧めします。FALSEFUN

于 2012-12-21T11:33:46.673 に答える
0

「snow」を使用したソリューション - 「clusterEvalQ(cl, library(clhs))」を追加するだけでうまくいきました。

a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))
abcd <- list(a, b, c, d)
library("snow")
cl <- makeCluster(4)
clusterEvalQ(cl, library(clhs))
results <- parLapply(cl, abcd, fun = function(elem) {
    clhs(x = elem, size = round(nrow(elem) / 2), iter = 50)
  })
stopCluster(cl)

zipfzapf と Roman Luštrik に感謝します。

于 2012-12-22T10:17:48.987 に答える