[英]R: foreach loop with nested for loops not looping through
我正在嘗試使一些嵌套循環在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慢於for(它沒有意義),要么foreach出於某種原因而沒有進入其他循環?
任何有關如何克服這個問題的想法將不勝感激。
停止執行時,沒有要檢查的k
單個值。 不同的k
傳遞給每個節點,因此在同一時刻,一個節點可能處於k = 3,而另一個節點可能處於k = 100。 您無權訪問k
這些不同值。 事實上,如果你使用%dopar%
該k
你當你停止執行無關與k
中的foreach:這是一樣的k
開始前的了。
例如,嘗試運行以下命令:
k <- 999
foreach(k=1:3) %dopar% { Sys.sleep(2) }
k
您將獲得999。
(另一方面,如果您嘗試foreach(k=1:3) %do% { ... }
,則將得到k = 3,就像在for
循環中使用k
。)
您的任務確實正在運行。 您將不得不等待它,或者以某種方式加快您(相當復雜的)循環的速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.