2017-09-12 7 views
0

このコードを並列化するためにかなりの時間をかけましたが、無駄です。私はエラーが出るか、何も動かない。誰にでもアイデアはありますか?R - ldply関数とレプリケート関数を並列化する

cal_Ops <- function(n, dtm, ratio = 0.1) { 
    print(n) 
    selVect <- sample(nrow(dtm), nrow(dtm) * ratio) 
    holdout <- dtm[selVect,] 
    training <- dtm[-selVect,] 
    topModel <- LDA(training, n, control = list(estimate.alpha = FALSE)) 
    return(c(n, perplexity(topModel, holdout), as.numeric(logLik(topModel)))) 
} 

require(plyr) 

replication <- 1000 

sequ <-seq(5,100,5) 

perplex <- ldply(sequ, function(x, dtm) { 
    t(replicate(replication, cal_Ops(x, dtm))) } , dtm = DTM_to_use) 

そのまま実行するには時間がかかります。前もって感謝します。

私は複製の並列バージョンとしてこの例を使用して試してみた - 私は多くのエラーを持っていましたが、: https://stackoverflow.com/a/19281611/8598566

+0

あなたはどのマシンですか? Windows? Linux/Mac? – CPak

+0

Windowsでいくつかのテストを行っていますが、最終的にはCentOS 6.6を実行している小さなHPCクラスター上で実行されます – Max

答えて

0

あなたの例では、例えば、再現性がありませんDTM_to_useが定義されていない、それは難しい「 - 次-べき仕事」の提案以外のを助けるために作る:

plyr::ldply(x)機能は、あなたが持っている労働者のどのような数に配布チャンクでxを処理する引数.parallel = TRUEをとります。これは内部で並列処理のためにforeachフレームワークを使用します。これにより、 "do"パッケージのいずれかを使用することができます。ここでは、将来のバックエンドを使用した例です。

library("doFuture") 
registerDoFuture() 

## Utilize all cores available to this R session 
plan(multiprocess) 

replication <- 1000 
sequ <-seq(from = 5, to = 100, by = 5) 
perplex <- plyr::ldply(sequ, function(x) { 
    t(replicate(replication, c(a = x, b = sqrt(x)))) 
}, .parallel = TRUE) 

str(perplex) 
'data.frame': 20000 obs. of 2 variables: 
$ a: num 5 5 5 5 5 5 5 5 5 5 ... 
$ b: num 2.24 2.24 2.24 2.24 2.24 ... 

あなたはHPCがあなたのターゲットであることを述べたので:あなたは、ジョブスケジューラなしアドホッククラスタを持っていますが、どこで、あなたが使用することができ、各ノードにSSHで接続することができた場合: node2node1node3と二つのコアに一つのコアそれぞれを実行する

plan(cluster, workers = c("node1", "node2", "node2", "node3")) 

。あなたが本当のジョブスケジューラを持っている場合は、あなたが使用することができ、SGEを言う:

library("future.batchtools") 
plan(batchtools_sge) 

sequ内の各要素を効果的に無限の数を有することに対応する(キュー上の個々のジョブとして処理されます労働者)。あなたがそれをチャンクしたいならば、あなたは労働者(=仕事)の数を制限することができます。

plan(batchtools_sge, workers = 200) 

使用するバックエンドに関係なく、スクリプトは同じに見えます。

関連する問題