使用的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