[英]How to write efficient nested functions for parallelization?
我有一个带有两个分组变量class
和group
的数据框。 对于每个班级,我每个小组都有一个绘图任务。 大多数情况下,我必须每2级class
,每个500个级别group
。
我正在使用parallel
包进行并行化,并使用mclapply
函数通过class
和group
级别进行迭代。
我想知道哪种方法是编写我的迭代的最佳方式。 我想我有两个选择:
class
变量运行并行化。group
变量运行并行化。 我的计算机有 3 个内核用于 R 会话,通常为我的操作系统保留第 4 个内核。 我想知道如果对具有 2 个级别的class
变量执行并行化,将永远不会使用第 3 个核心,所以我认为确保所有 3 个核心都将运行group
变量的并行化会更有效。 我已经编写了一些速度测试,以确保这是最好的方法:
library(microbenchmark)
library(parallel)
f = function(class, group, A, B) {
mclapply(seq(class), mc.cores = A, function(z) {
mclapply(seq(group), mc.cores = B, function(c) {
ifelse(class == 1, 'plotA', 'plotB')
})
})
}
class = 2
group = 500
microbenchmark(
up = f(class, group, 3, 1),
nest = f(class, group, 1, 3),
times = 50L
)
Unit: milliseconds
expr min lq mean median uq max neval
up 6.751193 7.897118 10.89985 9.769894 12.26880 26.87811 50
nest 16.584382 18.999863 25.54437 22.293591 28.60268 63.49878 50
结果告诉我应该对class
而不是group
变量使用并行化。
概述是我总是应该编写单核函数,然后调用它进行并行化。 我认为这样,我的代码会比编写具有并行化功能的嵌套函数更简单或更简化。
使用ifelse
条件是因为之前用于准备绘图任务数据的代码对于两个class
级别或多或少都是多余的,所以我认为编写一个更长的函数来检查使用哪个class
级别比“将此功能拆分为两个较短的功能。
编写这种代码的最佳做法是什么? 我很清楚,但因为我不是专业的数据科学家,我想知道你的工作方法。
这个威胁是围绕这个问题的。 但我认为我的问题是针对两种观点的:
谢谢
你刚才问过这个问题,但我会尝试回答,以防其他人想知道同样的事情。 首先,我喜欢先拆分我的任务,然后循环遍历每个部分。 这让我可以更好地控制这个过程。
parts <- split(df, c(df$class, df$group))
mclapply(parts, some_function)
其次,将任务分配到多个核心需要大量的计算开销,并且会抵消您从并行化脚本中获得的任何收益。 在这里, mclapply
将作业拆分为您拥有的mclapply
多个节点并执行一次分叉。 这比嵌套两个mclapply
循环更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.