R doParallel foreach 中的并行处理

Posted

技术标签:

【中文标题】R doParallel foreach 中的并行处理【英文标题】:Parallel proccessing in R doParallel foreach 【发布时间】:2016-10-08 00:23:18 【问题描述】:

我编写了一个运行良好的脚本,但它似乎没有进行并行处理。我尝试将内核从 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=",")

【问题讨论】:

好的,我尝试了建议并且脚本运行了,但似乎不再使用任何内核。我有 24 个,系统监视器和读取行的速率都显示相同的速度。我查看了使可重现的链接,并将查看是否可以使空间数据文件可重现。 > R.Version() $platform [1] "x86_64-w64-mingw32" $arch [1] "x86_64" $os [1] "mingw32" $system [1] "x86_64, mingw32" $status [1] "" $major [1] "3" $minor [1] "2.2" $year [1] "2015" $month [1] "08" $day [1] "14" $ svn rev [1] "69053" $language [1] "R" $version.string [1] "R 版本 3.2.2 (2015-08-14)" $nickname [1] "消防安全" 我研究了使用 rdgal 获取可重现数据,并且包含的​​多边形样本数据仅包含 2 个多边形。所以我在我的网站上放了一小部分数据样本:researchersdilemma.com/myftp 但是如果你想使用 rdgal.... library(rgdal) ogrDrivers() dsn 谢谢。是的,如果我们都使用内置数据通常会更好,不过感谢您上传。我会尽快尝试一下。 【参考方案1】:

好的,我想我是通过调用 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 进程。当然,我使用的示例数据很小,因此它并不需要所有这些内核,但它应该作为概念证明。

我从不超过这个比例,因为如果你使用 100% 的所有 CPU 内核,有时会发生坏事,其他服务器用户可能对你不满意。

【讨论】:

删除所有以前加载的数据后,我确实收到一个错误,表明 x-lake-length 向量没有被保存。有任何想法吗? > df_Test_Fetch @Jen 嘿抱歉,我刚刚看到你的评论。你还有这个问题吗?如果是这样,您能否提交一个新问题,以便更容易阅读,我会处理它? @Jen 如果您确实打开了另一个问题,请在此处使用链接发表评论,以便我一定会看到它。我明天可以帮忙。 嗨哈克-R。我在 R doParallel foreach 保存数据 [链接] (***.com/questions/37910490/…) 中发布了标题为并行处理的问题 @Jen 谢谢,抱歉,我才注意到这一点。我想我修复了代码。

以上是关于R doParallel foreach 中的并行处理的主要内容,如果未能解决你的问题,请参考以下文章

在 R doParallel foreach 循环中运行 ovun.sample

使用 doParallel 在 R 中并行化 keras 模型

使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环

GPU上的foreach多并行

R doParallel foreach 对独立工作者进行错误处理

在一组不同的解释变量上并行化 R 中的面板 logit 计算