2016-06-07 52 views
3

我已經編寫了一個運行良好的腳本,但它似乎並沒有進行並行處理。我嘗試將內核從3改爲16,但數據生成速度沒有改變。任何人都可以讓我知道我做錯了什麼,以及我如何才能使其工作?並行處理R doParallel foreach

setwd("E:/Infections") 

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(lakemorpho,rgdal,maptools,sp,doParallel,foreach, 
doParallel) 

cl <- makeCluster(5, outfile="E:/Infections/debug.txt") 
registerDoParallel(cl) 
x<-readOGR("E:/Infections/ByHUC6","Kodiak") 
x_lake_length<-vector("numeric",length = nrow(x)) 
for(i in 1:nrow(x)){ 
    tmp<-lakeMorphoClass(x[i,],NULL,NULL,NULL) 
    x_lake_length[i]<-lakeMaxLength(tmp,200) 
    print(i) 
    Sys.sleep(0.1) 
} 
df_Kodiak <- data.frame(x_lake_length) 
write.table(df_Kodiak,file="E:/Infections/ByHUC6/Kodiak.csv",row.names=TRUE,col.names=TRUE, sep=",") 
+0

好吧,我嘗試了建議和腳本運行,但同樣它似乎並不像任何更多的內核正在使用。我有24個,系統監視器和讀取行的速度都指示相同的速度。我查看了可重現的鏈接,並查看是否可以製作可重現的空間數據文件。 – Jen

+0

> R.Version() $平臺 [1] 「x86_64的-W64-的mingw32」 $拱 [1] 「x86_64的」 $ OS [1] 「的mingw32」 $系統 [1]「x86_64的,mingw32" 的 $狀態 [1] 「」 $主要 [1] 「3」 $未成年 [1] 「2.2」 $一年 [1] 「2015」 $一個月 [1]「 08「 $ day [1]」14「 $'svn rev' [1]」69053「 $ l語言 [1]「R」 $ version.string [1]「R版本3.2.2(2015-08-14)」 $暱稱 [1]「消防安全」 – Jen

+0

我研究了獲取可重現數據與rdgal和包含的多邊形樣本數據只包含2個多邊形。因此,我在我的網站上放了一小部分數據:http://researchersdilemma.com/myftp/ 但是,如果要使用rdgal的數據.... 庫(rgdal) ogrDrivers() dsn < - system.file(「vectors」,package =「rgdal」)[1] ogrListLayers(dsn) ogrInfo(dsn = dsn,layer =「trin_inca_pl03」) polys < - readOGR(dsn = dsn,layer = 「trin_inca_pl03」) writeOGR(多邊形, 「 」 「test_polys」 司機=「 ESRI shape文件」) getwd()#,看看那裏的文件放在 下載est_Fetch.zip – Jen

回答

2

好吧,我想我通過調用foreach%dopar%得到它:

# Libraries --------------------------------------------------------------- 
if (!require("pacman")) install.packages("pacman") 
pacman::p_load(lakemorpho,rgdal,maptools,sp,doParallel,foreach, 
       doParallel) 

# Data -------------------------------------------------------------------- 
ogrDrivers() 
dsn <- system.file("vectors", package = "rgdal")[1] 
ogrListLayers(dsn) 
ogrInfo(dsn=dsn, layer="trin_inca_pl03") 
owd <- getwd() 
setwd(dsn) 
ogrInfo(dsn="trin_inca_pl03.shp", layer="trin_inca_pl03") 
setwd(owd) 
x <- readOGR(dsn=dsn, layer="trin_inca_pl03") 
summary(x) 

# HPC --------------------------------------------------------------------- 
cores_2_use <- detectCores() - 4 
cl   <- makeCluster(cores_2_use, useXDR = F) 
clusterSetRNGStream(cl, 9956) 
registerDoParallel(cl, cores_2_use) 

# Analysis ---------------------------------------------------------------- 
myfun <- function(x,i){tmp<-lakeMorphoClass(x[i,],NULL,NULL,NULL) 
         x_lake_length<-vector("numeric",length = nrow(x)) 
         x_lake_length[i]<-lakeMaxLength(tmp,200) 
         print(i) 
         Sys.sleep(0.1)} 

foreach(i = 1:nrow(x),.combine=cbind,.packages=c("lakemorpho","rgdal")) %dopar% (
    myfun(x,i) 
) 

df_Kodiak <- data.frame(x_lake_length) 

正如你在截圖中看到以下創建使用24的20個CPU核心的Rscript.exe過程的軍隊。當然,我使用的示例數據很小,因此它並不真的需要所有這些內核,但它應該用作概念驗證。

我從來沒有超過這個比例,因爲如果你使用所有CPU核心的100%,有時會發生不好的事情,其他服務器用戶可能不滿意你。

Many CPU cores in use

+0

@Jen你非常歡迎,很高興它幫助:) –

+0

當我刪除所有以前加載的數據後,我得到一個錯誤,指示X湖長度向量沒有被保存。 任何想法? > df_Test_Fetch < - data.frame(x_lake_length) 數據錯誤。幀(x_lake_length):對象 'x_lake_length' 未找到 數據 ogrDrivers() DSN <-setwd( 「Y:\\伊樂\\ ByHUC6 \\」) ogrListLayers(DSN) ogrInfo(DSN = DSN,層= 「Test_Fetch」) OWD < - getwd() setwd(DSN) ogrInfo(DSN = 「Test_Fetch.shp」,層= 「Test_Fetch」) setwd(OWD) X < - readOGR(DSN = DSN,層=「Test_Fetch」) 摘要(x) – Jen

+0

@Jen嗨對不起,我剛剛看到你的評論。你還有這個問題嗎?如果是的話,你可以提交一個新的問題,以便閱讀起來更容易一些,我會繼續努力嗎? –