r - 如果 registerDoMC() 与大于内核数的数字一起使用会发生什么?
问题描述
我正在使用具有 4 核 CPU 的笔记本电脑,但不知何故使用registerDoMC(20)
似乎可以工作,就好像我有 20 个内核可用:
library(tictoc)
library(doMC)
detectCores()
#> [1] 4
registerDoMC(20)
tic()
a <- foreach(i = 1:20) %dopar% {
Sys.sleep(1)
i
}
toc()
#> 1.084 sec elapsed
由reprex 包(v0.3.0)于 2019-07-22 创建
这是如何解释的?如果我只有 4 个内核可用,那么 20 个作业如何在 1 秒内运行 + 一些开销?
起初,我以为我registerDoMC()
会为大于 的任何东西返回一个错误detectCores()
,但由于它没有并且我得到了这个令人惊讶的结果,我想我误解了foreach
.
解决方案
因为底层操作系统是一个多任务操作系统,它运行的进程已经比可用的内核多得多。这只是意味着您有更多实例,并且无法从同时在核心中运行的所有 R 子进程中受益。通常,当您超过核心数量时,随着同时核心数量的增加,整体性能的提高会下降,因此您在 ncores 之上的整体速度增益通常不值得付出努力。此外,如果存在“大型数据”,则在进程之间传输数据的时间非常重要。
我的做法通常是做“ncores 减 1”,将 1 个核心用于基本的操作系统管理工作……尽管如此,我偶尔也会用尽并且仍然看到好处。因此,虽然您可能不会通过使用比可用内核更多的进程来破坏任何东西,但我建议永远不要超过它,您不太可能(在 R 中)看到这样做带来的任何性能提升(并且可能会降低性能)。
推荐阅读
- mysql - 用户变量在会话中给出最后分配的值
- node.js - 用于响应应用程序的 Azure 网站上的 Http 404
- jquery - 无法从完成处理程序返回承诺
- ruby-on-rails - Rails 有条件地使用 Slim 应用类未决答案
- mysql - Plesk 安装 mysql 失败
- javascript - 请求 Apostrophe 的服务器
- java - 如何对春季日期时间格式验证进行单元测试
- wordpress - 从活动日历 wordpress 获取开始日期
- tsql - 链接服务器列级排序规则
- multithreading - 您应该如何将 C++14 共享互斥锁与 lambda 捕获和多线程一起使用?