r - 如何并行化 R 中包的函数

标签 r foreach parallel-processing parallel-foreach

我想并行化我正在处理的包的一部分。我应该使用哪些包和什么语法来使包在不同的体系结构上灵活可用?我的问题在一个 sapply()调用,如此模拟代码所示:

.heavyStuff <- function(x) { 
   # do a lot of work
   Sys.sleep(1)
}

listOfX <- 1:20

userFunc1 <- function(listOfX) {    
  res <- sapply(listOfX, .heavyStuff)
  return(res)
}

根据不同的指南,我编造了以下内容:
userFunc2 <- function(listOfX, dopar.arg=2) {
  if(requireNamespace("doParallel")) {
    doParallel::registerDoParallel(dopar.arg)
    res <- foreach(i=1:length(listOfX)) %dopar% {
       .heavyStuff(listOfX[[i]])
    }
    names(res) <- names(listOfX)
  } else {
    res <- sapply(listOfX, .heavyStuff)
  }
  return(res)
}

问题:
  • 我可以安全地在包中使用这样的代码吗?它会在一系列平台上运行良好吗?
  • 有没有办法避免foreach()构造?我更喜欢使用类似 sapply 或 lapply 的功能。但是,并行库中的构造似乎更加特定于平台。
  • 如果 dopar.arg==NULL 上面的代码不起作用,即使 the introduction to doParallel says that没有任何参数“你将得到三个 worker 并且在类 Unix 系统上
    您将获得大约等于系统核心数一半的工作线程数。”
  • 最佳答案

    作为作者的future框架,我建议你看看future.apply包,例如

    library(future.apply)
    userFunc2 <- function(listOfX) {    
      res <- future_sapply(listOfX, .heavyStuff)
      return(res)
    }
    

    默认设置是顺序运行,但如果用户愿意,他们可以使用他们喜欢的任何并行的 future 后端,例如
    library(future)
    plan(multiprocess)    # parallel on local machine - all cores by default
    
    library(future.batchtools)
    plan(batchtools_sge)  # parallel on an SGE compute cluster
    
    library(future)
    plan(sequential)      # sequentially
    

    设计模式是你决定并行化什么,而用户如何并行化。

    关于r - 如何并行化 R 中包的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53634543/

    相关文章:

    R:将数据框的元素与邻居相乘

    python - 在 R 与 Python 中 reshape 数据

    r - Shiny 的应用程序 actionButton 单击页面加载

    php - 将对象数组缩减为 'best 10'

    c# - 为什么 List<T>.ForEach 允许修改其列表?

    java - 在 java forEach 循环中获取值时出现问题

    c - 如何用 C 编写跨平台的并行程序?

    c# - 为什么Task.WaitAny不抛出异常?

    c++ - 在内循环中使用 OpenMP 时性能不佳

    r - 使用ggplot boxplot进行位置躲避警告?