web-dev-qa-db-ja.com

並列のparLapplyを使用:並列コード内の変数にアクセスできません

最近、いくつかのコアを備えたコンピューターを手に入れ、並列計算の使い方を学んでいます。私はlapplyにかなり熟練しており、parLapplyは非常によく似ていると言われました。私はそれを正しく操作していません。それを機能させるには、parLapply内にすべてを明示的に配置する必要があるようです(つまり、使用する関数、変数など)。 lapplyを使用すると、親環境から読み取られ、parLapplyはこれを実行しないようです。したがって、以下の私の例では、すべての情報をparLapply内に配置することですべてを機能させることができますが、ユーザー定義関数内でこれを使用すると、明示的にtext.varparLapplyの内部。

library(parallel)
text.var <- rep("I like cake and ice cream so much!", 20)
ntv <- length(text.var)
gc.rate <- 10

pos <-  function(i) {
    paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}

lapply(seq_len(ntv), function(i) {
        x <- pos(text.var[i])
        if (i%%gc.rate==0) gc()
        return(x)
    }

)

#doesn't work
cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, seq_len(ntv), function(i) {
        x <- pos(text.var[i])
        if (i%%gc.rate==0) gc()
        return(x)
    }

)

#does work but have to specify all the stuff inside parLapply
cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, seq_len(ntv), function(i) {
        ######stuff I have to put inside parLapply##########
        text.var <- rep("I like cake and ice cream so much!", 20)
        ntv <- length(text.var)
        gc.rate <- 10
        pos <-  function(i) {
            paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
        }
        ######stuff I have to put inside parLapply##########
        x <- pos(text.var[i])
        if (i%%gc.rate==0) gc()
        return(x)
    }
)

どうすればtext.varntvgc.rate、およびposからparLapplyへ明示的に配置せずに? (私はあなたがそれらをリストとして何とか渡したと思います)

PS Windows 7マシンなので、parLapplyを使用する必要があると思います

36
Tyler Rinker

これらの変数をクラスター内の他のRプロセスにエクスポートする必要があります。

cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"))
44
Andy

Martin Morganが提供する別の方法 もここで機能します。

このメソッドは、クラスターエクスポートを使用する必要なく、parLapply呼び出しでクラスター内の各ノードにオブジェクトを直接提供します。

library(parallel)
text.var <- rep("I like cake and ice cream so much!", 20)
ntv <- length(text.var)
gc.rate <- 10

pos <-  function(i) {
    paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}

cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, seq_len(ntv), function(i, pos, text.var, ntv, gc.rate) {
        x <- pos(text.var[i])
        if (i%%gc.rate==0) gc()
        return(x)
    }, pos, text.var, ntv, gc.rate
)
11
Tyler Rinker