web-dev-qa-db-ja.com

Rでforループを並列に実行します

次のようなforループがあります。

for (i=1:150000) {
   tempMatrix = {}
   tempMatrix = functionThatDoesSomething() #calling a function
   finalMatrix =  cbind(finalMatrix, tempMatrix)

}

この並行性の作り方を教えてください。

オンラインの例に基づいてこれを試しましたが、構文が正しいかどうかはわかりません。また、速度はあまり向上しませんでした。

finalMatrix = foreach(i=1:150000, .combine=cbind) %dopar%  {
   tempMatrix = {}
   tempMatrix = functionThatDoesSomething() #calling a function

   cbind(finalMatrix, tempMatrix)

}
33
kay

ご意見をいただきありがとうございます。この質問を投稿した後、parallelを検索しました。

最後に、数回試した後、実行しました。他の人に役立つように、以下のコードを追加しました

_library(foreach)
library(doParallel)

#setup parallel backend to use many processors
cores=detectCores()
cl <- makeCluster(cores[1]-1) #not to overload your computer
registerDoParallel(cl)

finalMatrix <- foreach(i=1:150000, .combine=cbind) %dopar% {
   tempMatrix = functionThatDoesSomething() #calling a function
   #do other things if you want

   tempMatrix #Equivalent to finalMatrix = cbind(finalMatrix, tempMatrix)
}
#stop cluster
stopCluster(cl)
_

注-ユーザーがあまりにも多くのプロセスを割り当てると、ユーザーはこのエラーを受け取る可能性があるという注意を追加する必要があります:Error in serialize(data, node$con) : error writing to connection

注-foreachステートメントの_.combine_がrbindの場合、返される最終オブジェクトは、各ループの出力を行ごとに追加することにより作成されます。

これが私のようにRで初めて並列処理を試みる人に役立つことを願っています。

参照: http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/https://beckmw.wordpress.com/2014/01/21/a-brief-foray-into-parallel-processing-with-r /

59
kay