簡體   English   中英

R:foreach循環與嵌套for循環不循環通過

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM