美文网首页
R语言并行计算

R语言并行计算

作者: kittybaby | 来源:发表于2020-02-03 13:05 被阅读0次

R包

parallel
doparallel
foreach

parallel包

1.鉴定本机的核数

# Load the parallel package
library(parallel)

# Store the number of cores in the object no_of_cores
no_of_cores <-detectCores()

# Print no_of_cores
print(no_of_cores)

2.parApply

3.parSapply

可变范围
在Mac / Linux上,您可以选择使用自动包含所有环境变量的makeCluster(no_core,type =“FORK”)(以下详细信息)。 在Windows上,您必须使用并行插座集群(PSOCK),其中仅包含已加载的基本包(请注意,PSOCK在所有系统上都是默认值)。 因此,您应该始终指定并行功能所需的哪些变量和库,例如 以下失败:

> cl<-makeCluster(4)
> base <- 2
>  
> parLapply(cl, 
+           2:4, 
+           function(exponent) 
+             base^exponent)
Error in checkForRemoteErrors(val) : 
  3 nodes produced errors; first error: 找不到对象'base'
>  
> stopCluster(cl)
> cl<-makeCluster(4)
>  
> base <- 2
> clusterExport(cl, "base")
> parLapply(cl, 
+           2:4, 
+           function(exponent) 
+             base^exponent)
[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 16

您需要使用clusterExport(cl,“base”)才能使该函数看到基本变量。 如果您正在使用某些特殊软件包,那么同样需要通过clusterEvalQ来加载它们。 我经常使用rms包,因此我使用clusterEvalQ(cl,library(rms))。 请注意,对clusterExport后变量的任何更改都将被忽略:

> cl<-makeCluster(no_cores)
> clusterExport(cl, "base")
> base <- 4
> # Run
> parLapply(cl, 
+           2:4, 
+           function(exponent) 
+             base^exponent)
[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 16

>  
> # Finish
> stopCluster(cl)

方法一

y  <- 1:10
sapply(1:5, function(x) x + y)
library(parallel)
cl <- makeCluster(2)
y  <- 1:10
# add y to function definition and parSapply call
parSapply(cl, 1:5, function(x,y) x + y, y)
# export y to the global environment of each node
# then call your original code
clusterExport(cl, "y")
parSapply(cl, 1:5, function(x) x + y)

方法二

library(parallel)
fun <- function(cl, y) {
  parSapply(cl, 1:5, function(x) x + y)
}
cl <- makeCluster(2)
fun(cl, 1:10)
stopCluster(cl)

4.mclapply(wins不能使用)

workerFunc <- function(n) { return(n^2) }
values <- 1:100
library(parallel)
## Number of workers (R processes) to use:
numWorkers <- 8
## Parallel calculation (mclapply):
res <- mclapply(values, workerFunc, mc.cores = numWorkers)
print(unlist(res))
#Error in mclapply(values, workerFunc, mc.cores = numWorkers) : 
#   Windows不支持'mc.cores' > 1

5.parLapply

workerFunc <- function(n) { return(n^2) }
values <- 1:100
library(parallel)
## Number of workers (R processes) to use:
numWorkers <- 8
## Set up the ’cluster’
cl <- makeCluster(numWorkers, type = "PSOCK")
## Parallel calculation (parLapply):
res <- parLapply(cl, values, workerFunc)
## Shut down cluster
stopCluster(cl)
print(unlist(res))

foreach包

> library(foreach)
> library(doParallel)
载入需要的程辑包:iterators
>  
> cl<-makeCluster(no_cores)
> registerDoParallel(cl)
> foreach(exponent = 2:4, 
+         .combine = c)  %dopar%  
+   base^exponent
[1]  16  64 256


> foreach(exponent = 2:4, 
+         .combine = rbind)  %dopar%  
+   base^exponent
         [,1]
result.1   16
result.2   64
result.3  256


> foreach(exponent = 2:4, 
+         .combine = list,
+         .multicombine = TRUE)  %dopar%  
+   base^exponent
[[1]]
[1] 16

[[2]]
[1] 64

[[3]]
[1] 256


> foreach(exponent = 2:4, 
+         .combine = list)  %dopar%  
+   base^exponent
[[1]]
[[1]][[1]]
[1] 16

[[1]][[2]]
[1] 64


[[2]]
[1] 256
#stopImplicitCluster()

变量的域
默认情况下,相同的本地环境中的变量是可用的:

base <- 2
cl<-makeCluster(2)
registerDoParallel(cl)
foreach(exponent = 2:4, 
        .combine = c)  %dopar%  
  base^exponent
stopCluster(cl)

> cl <- makeCluster(2)
> test <- function (exponent) {
+   foreach(exponent = 2:4, 
+           .combine = c)  %dopar%  
+     base^exponent
+ }
> test()
 Show Traceback
 
 Rerun with Debug
 Error in base^exponent : task 1 failed - "找不到对象'base'" 
 
 
 > base <- 2
> cl<-makeCluster(2)
> registerDoParallel(cl)
>  
> base <- 4
> test <- function (exponent) {
+   foreach(exponent = 2:4, 
+           .combine = c,
+           .export = "base")  %dopar%  
+     base^exponent
+ }
> test()
[1]  16  64 256
>  
> stopCluster(cl)

同样,您可以使用.packages选项加载软件包,例如 .packages = c(“rms”,“mouse”)。 我强烈建议您始终导出所需的变量,因为它会限制在函数中封装代码时出现的问题。

cl <- makeCluster(4)
> registerDoParallel(cl)
> x <- iris[which(iris[,5] != "setosa"), c(1,5)]
> trials <- 10000
> ptime <- system.time({
+    r <- foreach(icount(trials), .combine=cbind) %dopar% {
+      ind <- sample(100, 100, replace=TRUE)
+      result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
+      coefficients(result1)
+      }
+    })[3]
> ptime
elapsed 
  20.01 
  
  
> stime <- system.time({
+    r <- foreach(icount(trials), .combine=cbind) %do% {
+      ind <- sample(100, 100, replace=TRUE)
+      result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
+      coefficients(result1)
+      }
+    })[3]
> stime
elapsed 
  39.17 
stopCluster(cl)

参考资料

http://gforge.se/2015/02/how-to-go-parallel-in-r-basics-tips/
https://stackoverflow.com/questions/24040280/parallel-computation-of-multiple-imputation-by-using-mice-r-package/27087791#27087791

相关文章

  • R语言并行计算

    R包 paralleldoparallelforeach parallel包 1.鉴定本机的核数 2.parApp...

  • R语言--并行计算包(parallel、foreach)

    R语言是单核计算语言,在数据建模或计算过程中,常常出现相同或相似任务的重复计算,一般操作是for循环处理或采用ap...

  • MPI编程入门详解

    MPI简介 说到并行计算,我们有一个不可绕开的话题——MPI编程。MPI是一个跨语言的通讯协议,用于编写并行计算机...

  • 学习小组Day4笔记-皇晓燕

    R语言和R studio R语言是全面的统计分析平台,计算作图等等 R studio是R语言的操作平台 下载R语言...

  • Python 多进程并行编程实践: multiprocessin

    前言 并行计算是使用并行计算机来减少单个计算问题所需要的时间,我们可以通过利用编程语言显式的说明计算中的不同部分如...

  • 03-Metal语言介绍

    Metal 语言介绍 Metal着色语言是一个用来编写3D图形渲染逻辑和并行计算核心逻辑的编程语言,编写Metal...

  • Day4 学习小组--张小张

    今天是 R 语言基础的学习 了解R与Rstudio R 语言是一款统计软件; R 语言也是一门编程语言,语言也是一...

  • 学习小组Day4笔记--扬马延

    R语言学习 1. R以及R studio安装 直接搜索R语言网页可直接安装 2. R语言入门 参考书目《R for...

  • 《学习小组Day4笔记--寒鹤》

    R语言基础 今天的课程内容是R语言基础,包括R及Rstudio的安装,R语言的一些基本操作等。因之前已学习过R语言...

  • R语言基础--数据类型-总结

    R语言基础--数据类型-总结 1、R语言基础--数据类型之向量 2、R语言基础--数据类型之因子 3、R语言基础-...

网友评论

      本文标题:R语言并行计算

      本文链接:https://www.haomeiwen.com/subject/cjdhxhtx.html