我试图让一些嵌套循环在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只是因为某种原因没有进入其他循环?
如何克服这个问题的任何想法将不胜感激。
答案 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
一样。)
您的任务确实在运行。你必须要么等待它,要么以某种方式加速你的(相当复杂的)循环。