R doParallel foreach中的并行处理
Parallel proccessing in R doParallel foreach
我编写了一个运行良好的脚本,但它似乎没有进行并行处理。我尝试将核心数从 3 更改为 16,但生成数据的速度没有改变。任何人都可以让我知道我做错了什么以及如何让它工作吗?
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=",")
好的,我想我是通过调用 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 个 CPU 核心中的 20 个创建一个 Rscript.exe 进程大军。当然,我使用的示例数据很小,所以它并不需要那么多内核,但它应该作为概念验证。
我从不超过这个比例,因为如果你使用所有 CPU 核心的 100%,有时会发生不好的事情,其他服务器用户可能对你不满意。
我编写了一个运行良好的脚本,但它似乎没有进行并行处理。我尝试将核心数从 3 更改为 16,但生成数据的速度没有改变。任何人都可以让我知道我做错了什么以及如何让它工作吗?
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=",")
好的,我想我是通过调用 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 个 CPU 核心中的 20 个创建一个 Rscript.exe 进程大军。当然,我使用的示例数据很小,所以它并不需要那么多内核,但它应该作为概念验证。
我从不超过这个比例,因为如果你使用所有 CPU 核心的 100%,有时会发生不好的事情,其他服务器用户可能对你不满意。