R

R 多线程跑任务 ----- parallel

2021-05-13  本文已影响0人  日月其除

使用的R包 library(parallel),实现多线程操作。多线程即将任务分配到多个核中,能够缩减运行时间。
parallel包主要是针对apply家族的多线程。

> cl.cores <- detectCores() ; cl.cores  #检查当前的使用的电脑的核数
[1] 8
> cl <- makeCluster(getOption("cl.cores", 4)); cl 
socket cluster with 4 nodes on host ‘localhost’  #使用核的数量
> clusterExport(cl, c('变量1', '变量2')) #输入变量或者function 
> clusterEvalQ(cl,{library(tibble)
  library(ggplot2)
  }) #加载包,这里需要对后续多核运行的脚本中需要的用到的包重新加载
stopCluster() 关闭集群

虽然在脚本最开始的时候,已经加载了这些R包了,但是由于利用多线程的脚本中还是得利用函数 clusterEvalQ() 重新加载一次,不然就会报错,例如 “%>% function 找不到”。

多线程运行的函数
最常用的parLapply() 是 lapply()函数的并行版本

Usage
clusterCall(cl = NULL, fun, ...)
clusterApply(cl = NULL, x, fun, ...)
clusterApplyLB(cl = NULL, x, fun, ...)
clusterEvalQ(cl = NULL, expr)
clusterExport(cl = NULL, varlist, envir = .GlobalEnv)
clusterMap(cl = NULL, fun, ..., MoreArgs = NULL, RECYCLE = TRUE,
           SIMPLIFY = FALSE, USE.NAMES = TRUE,
           .scheduling = c("static", "dynamic"))
clusterSplit(cl = NULL, seq)

parLapply(cl = NULL, X, fun, ..., chunk.size = NULL)
parSapply(cl = NULL, X, FUN, ..., simplify = TRUE,
          USE.NAMES = TRUE, chunk.size = NULL)
parApply(cl = NULL, X, MARGIN, FUN, ..., chunk.size = NULL)
parRapply(cl = NULL, x, FUN, ..., chunk.size = NULL)
parCapply(cl = NULL, x, FUN, ..., chunk.size = NULL)

parLapplyLB(cl = NULL, X, fun, ..., chunk.size = NULL)
parSapplyLB(cl = NULL, X, FUN, ..., simplify = TRUE,
            USE.NAMES = TRUE, chunk.size = NULL)

举个栗子:

> library(tidyverse)
-- Attaching packages ------------------------------------------------------ tidyverse 1.3.0 --
√ ggplot2 3.3.3     √ purrr   0.3.4
√ tibble  3.0.5     √ dplyr   1.0.3
√ tidyr   1.1.2     √ stringr 1.4.0
√ readr   1.4.0     √ forcats 0.5.1
-- Conflicts --------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
> library(parellel)
> cl <- makeCluster(getOption("cl.cores", 4))
> list1 = c(1,2,3,6,7,9) %>% list(); list1 
[[1]]
[1] 1 2 3 6 7 9
> list2 = c(1,5,3,6,8,8) %>% list(); list2
[[1]]
[1] 1 5 3 6 8 8
> list_example = c(list1,list2) ; list_example
[[1]]
[1] 1 2 3 6 7 9
[[2]]
[1] 1 5 3 6 8 8

> a = parLapply(cl,list_example, function(x){
  x = x+1
})
> a
[[1]]
[1]  2  3  4  7  8 10

[[2]]
[1] 2 6 4 7 9 9
> stopCluster(cl)

以下的内容是网络上粘贴的,但是忘记出处,如有侵权,请与我联系。
常用函数
makeCluster、clusterExport、clusterEvalQ、clusterApply、parLapply、parSapply、parApply

detectCores() 检查当前的可用核数
clusterExport() 配置当前环境
makeCluster() 分配核数
stopCluster() 关闭集群
parLapply() lapply()函数的并行版本

makeCluster(spec, type, ...)用于创建并行集合。参数spec可以理解为线程数,或并行计算“打开R控制台”的数量;参数type默认值为"PSOCK",是一种组织并行计算的底层结构,这个参数还可以选"FORK"。

clusterEvalQ(cl = NULL, expr)用于在各线程中运行一些表达式,通常是用于加载各种包。参数cl表示要调用的并行集合(即makeCluster函数的运行结果);参数expr表示表达式。

clusterExport(cl = NULL, varlist, envir = .GlobalEnv) 用于
导入需要的变量。参数cl表示要调用的并行集合(即makeCluster函数的运行结果);参数varlist表示要导入的变量名称集合,相当于打开多个R控制台后在每个控制台中导入这些变量;参数envir,表示上述变量的来源,默认值.GlobalEnv表示变量从当前全局环境中导入。

clusterEvalQ(cl = NULL, expr)用于在各线程中运行一些表达式,通常是用于加载各种包。参数cl表示要调用的并行集合(即makeCluster函数的运行结果);参数expr表示表达式

PS:
针对for循环的并行运算的包foreach, mclapply()用法参考。
https://zhuanlan.zhihu.com/p/24547984

上一篇下一篇

猜你喜欢

热点阅读