使用parallel或doParallel为多个OS作为CRAN包的自定义包

Pas*_*ten 6 parallel-processing r cran

我正在为R构建一个包,我希望能够跨平台.我正在Linux下开发,该函数mclapply将从parallel包中使用.Windows(使用doParallel)不支持此程序包.我真的很喜欢这个parallel软件包,因为它的简单性和速度,我不知道这是否应该是为CRAN提供2个不同版本的软件包的原因,对于单独的操作系统(似乎需要额外的维护工作),而不是提到它是否被允许.

思考?

而且,现在我对parallel的是

mclapply(ldata, function(x), mc.cores=cores)
Run Code Online (Sandbox Code Playgroud)

相当于doParallel's

cl <- makeCluster(cores)
parLapply(cl, ldata, function(x))
Run Code Online (Sandbox Code Playgroud)

那是对的吗?

Ste*_*ton 12

首先,无论是mclapplyparLapply是在parallel包装,但mclapply实际上并不在并行运行在Windows上. parLapply在所有支持的平台上并行运行,但并不总是如此高效mclapply.该doParallel包与foreach包一起使用,并充当包的适配器parallel.

要编写适用于Windows和非Windows的软件包,您有多种合理的选择:

  • 只需使用,parLapply因为它无处不在
  • 使用parLapplyWindows和mclapply其他地方
  • 使用doParallelforeach

doParallel软件包很方便,因为它可以mclapply在非Windows平台上使用.例如:

library(doParallel)
registerDoParallel()
foreach(i=1:10, .options.snow=list(preschedule=TRUE)) %dopar% {
    Sys.sleep(2)
}
Run Code Online (Sandbox Code Playgroud)

这适用mclapply于Linux和Mac OS X,但会在Windows后面的幕后自动创建PSOCK群集对象.使用preschedule=TRUE(在doParallel1.0.3中添加)将导致doParallel在内部使用预先安排任务clusterApply,就像parLapply.

请注意,如果你明确地创建并注册群集对象,然后mclapply被使用,无论平台.它会工作正常,但可能效率不高.要使用mclapply,您必须registerDoParallel使用数字参数调用,或者根本不调用任何参数.

您可以查看boot软件包的源代码,以获取如何使用mclapplyparLapply依赖于您的平台的示例.