60

我有一个类似这样的 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)

}
4

1 回答 1

100

感谢您的反馈意见。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

注意 - 如果.combineforeach语句中是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/

于 2016-07-12T17:43:02.463 回答