r - Windows 不支持“mc.cores”> 1

标签 r windows parallel-processing multicore

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

以下是我的代码片段:


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 中使用并行处理,以减少运行代码的时间。
任何帮助将不胜感激。

最佳答案

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

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(),请确保始终有不使用它的选项。原因是它不能保证在所有环境下都能正常工作,也就是说,它可能会不稳定并导致 R 崩溃。在 R-devel 线程中,'mclapply 在运行 GAM 时在 MacOS 上返回 NULL'(https://stat.ethz.ch/pipermail/r-devel/2020-April/079384.html),mclapply() 的作者在2020-04-28:

Do NOT use mcparallel() in packages except as a non-default option that user can set for the reasons Henrik explained. Multicore is intended for HPC applications that need to use many cores for computing-heavy jobs, but it does not play well with RStudio and more importantly you don't know the resource available so only the user can tell you when it's safe to use. Multi-core machines are often shared so using all detected cores is a very bad idea. The user should be able to explicitly enable it, but it should not be enabled by default.

关于r - Windows 不支持“mc.cores”> 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62080053/

相关文章:

c++ - 使用 WM_USER、WM_APP 或 RegisterWindowMessage

windows - 如何在 Windows 7 中更改 Safari 中的默认用户代理?

c# - 发送被 GetAsyncKeyState() 忽略的虚拟鼠标点击?

ubuntu - 可以有多少个并行用户进程?

r - 使用 knitrBootstrap 示例下拉样式

R:将模型系数应用于模型中的变量,这是更好的方法吗?

c - 如何使用 OpenMP 在顺序循环中嵌套并行循环

hadoop - 如何分配数据和计算以最大化位置?

r - R system.time(exp) 输出中测量的 'user' 和 'system' 时间是多少?

r - 以整洁的方式匿名化数据框的选定列