R:foreach循环,嵌套for循环不循环

时间:2014-06-04 18:45:54

标签: r foreach parallel-processing

我试图让一些嵌套循环在R(在Windows中)运行得更快,主循环运行通过大数据集(即800000 x 3矩阵)。

尝试从中间循环中删除临时变量后,我现在试图让R在我的机器的4个核心而不是1上运行循环。

因此我做了以下事情:

install.packages('doSNOW')
library(doSNOW)
library(foreach)

c1<-makeCluster(4)  
registerDoSNOW(c1)

foreach(k=1:length(big_data[,1])) %dopar% {

x<-big_data[k,1]
y<-big_data[k,2]

  for (i in 1:length(data_2[,1] {
   if ( # condition on x and y) {
    new_data1<- …
  new_data2<- …
  new_data3<- …
    for (j in 1:length(new_data3)) {
# do something
}
}
}
rm(new_data1)
rm(new_data2)
rm(new_data3)
gc()
}
stopCluster(c1)

我的问题是R继续运行,当我手动停止脚本10分钟后,我仍然有k = 1(没有从R得到任何明显的错误)。我可以看到,当R运行它正在使用4核精细。

相比之下,当我使用简单的for循环而不是foreach时,只使用了1个核心,但至少在10分钟后我的索引k增加了,并且结果被存储。

所以看起来要么,foreach要慢得多(没有意义),或者foreach只是因为某种原因没有进入其他循环?

如何克服这个问题的任何想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

当您停止执行时,不会检查k的单个值。将不同的k传递给每个节点,因此在同一时刻,一个节点可能在k = 3,而另一个节点可能在k = 100。您无权访问k的这些不同值。事实上,如果您使用%dopar%,则停止执行时获得的k与foreach中的k无关:它与k相同你在开始之前就已经有了。

例如,尝试运行:

k <- 999
foreach(k=1:3) %dopar% { Sys.sleep(2) }
k

你会得到999。

(另一方面,如果您尝试foreach(k=1:3) %do% { ... },则会得到k = 3,就像您在k循环中使用for一样。)

您的任务确实在运行。你必须要么等待它,要么以某种方式加速你的(相当复杂的)循环。