r - 增加 mc.cores 超出逻辑核心数
问题描述
玩弄 R 函数parallel::mclapply
,我发现参数mc.cores
可以选择大于逻辑核心的数量(如 所示parallel::detectCores
),从而导致加速比逻辑核心的数量更大。这是一个最小的例子(对我来说,这适用于 MacOS 和 Linux):
sleepy <- function(i) {
start <- Sys.time()
Sys.sleep(i)
as.numeric(Sys.time() - start)
}
mc.cores <- 100L
ntasks <- 10000L
start <- Sys.time()
out <- parallel::mclapply(2/ntasks*runif(ntasks), sleepy, mc.cores = mc.cores)
real_duration <- as.numeric(Sys.time() - start)
cpu_duration <- sum(unlist(out))
data.frame(logical.cores = parallel::detectCores(),
mc.cores = mc.cores,
speedup = cpu_duration/real_duration)
## logical.cores mc.cores speedup
## 1 8 100 30.49574
我还在一个更现实的例子中尝试了这一点,即接近我想要并行化的真实场景:这也没有导致任何问题。
在 /tutorials on 的文档中parallel::mclapply
,我找不到任何mc.cores > detectCores()
选择的示例,而且很可能有一个很好的理由。
有人可以解释这种做法有什么问题吗?在某些情况下是否合理,例如当内存需求不是问题时?
解决方案
我有时会mc.cores > detectCores()
用来限制内存使用。如果您将一个作业分成 10 个部分并使用 和 处理它们mclapply
,mc.preschedule=F
则每个核心一次只能处理 10% 的作业。例如,如果mc.cores
设置为两个,则其他 8 个“节点”必须等到一个部分完成后才能开始新的部分。如果您遇到内存问题并希望防止每个循环超出其处理能力,这可能是可取的。
推荐阅读
- android - api字符串响应的AES加密在开始时返回额外的字符
- python - 在 Python 中绘制 3D 条件函数
- angular - 在 anuglar 组件 html 文件中出现错误:找不到带有路径的控件
- salesforce - APEX:从内部 pbx 集成到 Salesforce
- android - 使用基于广告服务 UUID 的扫描过滤器扫描 BLE 外围设备
- docusignapi - 在用户签署文件后,我在哪里可以检查 docusign 是否调用了我的重定向 URL?我在哪里可以检查网址是否正确?
- php - PHP json解码数组反向
- docusignapi - 用于将通知/提醒发送到进程内信封的 docusign REST API
- c# - 设置父级时是否可以初始化嵌套属性?
- python-3.x - Pandas:使用 DataFrameGroupBy.filter() 方法选择 DataFrame 的行,其值大于相应组的平均值