2016-06-07 53 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嗨对不起,我刚刚看到你的评论。你还有这个问题吗?如果是的话,你可以提交一个新的问题,以便阅读起来更容易一些,我会继续努力吗? –