美文网首页R
R 多线程跑任务 ----- parallel

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

作者: 日月其除 | 来源:发表于2021-05-13 21:30 被阅读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

    相关文章

      网友评论

        本文标题:R 多线程跑任务 ----- parallel

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