【问题标题】:'mc.cores' > 1 is not supported on WindowsWindows 不支持“mc.cores”> 1
【发布时间】:2020-05-29 06:38:59
【问题描述】:

我是编程新手,我正在尝试使用现有代码在 Windows 中对 R 使用并行处理。

以下是我的代码的 sn-p:



if (length(grep("linux", R.version$os)) == 1){
    num_cores = detectCores()
    impact_list <- mclapply(len_a, impact_func, mc.cores = (num_cores - 1))
  } 
  # else if(length(grep("mingw32", R.version$os)) == 1){
  #   num_cores = detectCores()
  #   impact_list <- mclapply(len_a, impact_func, mc.cores = (num_cores - 1))
  # 
  # }
  else{
    impact_list <- lapply(len_a, impact_func)
  }
  return(sum(unlist(impact_list, use.names = F)))

这很好用,我在 Windows 上使用 R,所以代码进入 'else' 语句,它使用 lapply() 运行代码,而不是通过并行处理。


我添加了“else if”语句以使其适用于 Windows。因此,当我取消注释“else if”代码块并运行它时,我收到错误“Windows 不支持'mc.cores'> 1”。 请建议我如何在 Windows 中使用并行处理,以减少运行代码的时间。 任何帮助将不胜感激。

【问题讨论】:

标签: r windows parallel-processing multicore


【解决方案1】:

(免责声明:我是这里未来框架的作者)

future.apply 包提供 R 内置“应用”函数的并行版本。它是跨平台的,即它可以在 Linux、macOS 和 Windows 上运行。该软件包允许您经常将现有的 lapply() 替换为 future_lapply() 调用,例如

library(future.apply)
plan(multisession)

your_fcn <- function(len_a) {
  impact_list <- future_lapply(len_a, impact_func)
  sum(unlist(impact_list, use.names = FALSE))
}

关于 mclapply() 本身:如果您在代码中使用 parallel::mclapply(),请确保始终有一个选项 not 可以使用它。原因是它不能保证在所有环境下都能正常工作,也就是说,它可能会不稳定并导致 R 崩溃。在 R-devel 线程中,'mclapply 在 MacOS 上运行 GAM 时返回 NULL'(https://stat.ethz.ch/pipermail/r-devel/2020-April/079384.html),@ 的作者987654327@ 2020-04-28 写:

不要在包中使用 mcparallel() 除非作为非默认选项,用户可以根据 Henrik 解释的原因进行设置。多核适用于需要使用许多核来完成计算繁重的工作的 HPC 应用程序,但它不能很好地与 RStudio 配合使用,更重要的是,您不知道可用的资源,因此只有用户可以告诉您何时可以安全使用。多核机器通常是共享的,因此使用所有检测到的内核是一个非常糟糕的主意。用户应该能够显式启用它,但默认情况下不应启用它。

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2022-11-23
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多