我正在为R构建一个包,我希望能够跨平台。我正在Linux下开发,函数mclapply
将在parallel
包中使用。 Windows不支持此程序包(使用doParallel
)。我真的很喜欢parallel
软件包,因为它的简单性和速度,我不知道这是否应该是为CRAN提供2个不同版本的软件包的原因,对于单独的操作系统(似乎是额外的工作维持),更不用说它是否被允许。
思想?
另外,现在我关注parallel
的
mclapply(ldata, function(x), mc.cores=cores)
等同于doParallel
的
cl <- makeCluster(cores)
parLapply(cl, ldata, function(x))
这是对的吗?
答案 0 :(得分:11)
首先,mclapply
和parLapply
都在parallel
包中,尽管mclapply
实际上并不在Windows上并行运行。 parLapply
在所有支持的平台上并行运行,但并不总是与mclapply
一样高效。 doParallel
包与foreach
包一起使用,并充当parallel
包的适配器。
要编写适用于Windows和非Windows的软件包,您有多种合理的选择:
parLapply
,因为它适用于所有地方parLapply
,在其他地方使用mclapply
doParallel
与foreach
doParallel
包很方便,因为它在非Windows平台上使用mclapply
。例如:
library(doParallel)
registerDoParallel()
foreach(i=1:10, .options.snow=list(preschedule=TRUE)) %dopar% {
Sys.sleep(2)
}
这在Linux和Mac OS X上使用mclapply
,但会在Windows后面的幕后自动创建PSOCK群集对象。使用preschedule=TRUE
(在doParallel
1.0.3中添加)将导致doParallel
在内部使用clusterApply
预先计划任务,就像{{parLapply
一样1}}。
请注意,如果您明确创建并注册了群集对象,则mclapply
将不使用,无论平台如何。它会工作正常,但可能效率不高。要使用mclapply
,您必须使用数字参数调用registerDoParallel
,或者根本不调用任何参数。
您可以查看boot
包的源代码,了解如何使用mclapply
或parLapply
的示例,具体取决于您的平台。