2014-11-20 75 views
0

我遇到了並行處理和R中的foreach函數的問題。我在運行我的foreach代碼並監視進度之前立即註冊了6個集羣。我看到我的CPU幾乎達到了70%(自從註冊了所有6個內核以來,預計會達到100%),但是幾秒鐘後它就會下降,似乎正在完成單個內核的其餘工作。我使用doMC軟件包在我的linux機器上運行了相同的代碼,在那裏我獲得了100%的CPU大約10秒,然後它在一個核心上減少並完成。這導致我相信問題是我寫了我的代碼。R並行處理過早結束

我有一個開始和結束緯度/經度列的位置數據集。我正在使用geophere包來計算每行的開始到結束的大圓路徑,每行將數據集中的每個原始行擴展爲12行,之後我將結果重新綁定到繪圖的數據框中。

完成後,我的整個數據集應該大約爲35M行,所以我真的想要利用多個內核。

library(foreach) 
library(doParallel) 

cl = makeCluster(6) 
registerDoParallel(cl) 

arc = foreach (i = temp$id, .combine = rbind, .packages = "geosphere") %dopar% { 
    data.frame(
    id = rep(temp[i, 9], 12), 
    supplier = rep(temp[i, 1], 12), 
    receiving_facility = rep(temp[i, 2], 12), 
    commodity = rep(temp[i, 3], 12), 
    weight = rep(temp[i, 4], 12), 
    time_period = rep(temp[i, 5], 12), 
    lat = gcIntermediate(p1 = c(temp$supp_lon[i], temp$supp_lat[i]), 
         p2 = c(temp$rec_lon[i], temp$rec_lat[i]), n = 10, 
         addStartEnd = TRUE)[,2], 
    lon = gcIntermediate(p1 = c(temp$supp_lon[i], temp$supp_lat[i]), 
         p2 = c(temp$rec_lon[i], temp$rec_lat[i]), n = 10, 
         addStartEnd = TRUE)[,1]) 
    } 
stopCluster(cl) 

enter image description here

+0

這可能是因爲我們只是遵循不同的教程,但我使用doMC pakage中的'registerDoMC(numberOfCores)'來註冊所需數量的教程。可能可以幫助 – OganM 2014-11-20 20:35:10

+0

doMC在Windows中不起作用,但是我在我的linux上使用並設置了相同的結果 – JestonBlu 2014-11-20 21:57:02

回答

2

我認爲這將是一個更好的評論,但我沒有爲它的聲譽呢。

據我的理解,從我的經驗來看,它是按照預期工作的。並行運行代碼。但是,行綁定功能(即將所有功能重新組合在一起)是在單個內核上完成的,這就是爲什麼您在最後看到額外的單核處理時間的原因。

-1

在不合並結果的情況下運行該過程。或者返回一個虛擬值,以便組合速度非常快。這樣您可以確認單核是由於.combine還是由於代碼問題。就你的代碼而言,它看起來沒問題,並行性按預期實現。