首先,两者mclapply和parLapply都在parallel包中,尽管mclapply实际上并没有在 Windows 上并行运行。 parLapply在所有支持的平台上并行运行,但并不总是像mclapply. doParallel包与包一起使用,foreach并充当包的适配器parallel。
要编写适用于 Windows 和非 Windows 的包,您有多种合理的选择:
- 只需使用
parLapply,因为它适用于任何地方
parLapply在 Windows 和mclapply其他地方使用
doParallel与_foreach
该doParallel软件包很方便,因为它可以mclapply在非 Windows 平台上使用。例如:
library(doParallel)
registerDoParallel()
foreach(i=1:10, .options.snow=list(preschedule=TRUE)) %dopar% {
Sys.sleep(2)
}
这mclapply在 Linux 和 Mac OS X 上使用,但会在 Windows 上自动在后台创建 PSOCK 集群对象。preschedule=TRUE(在doParallel1.0.3中添加)的使用将导致doParallel在内部使用预调度任务clusterApply,就像parLapply.
请注意,如果您显式创建并注册了一个集群对象,那么无论平台如何,都不会mclapply被使用。它可以正常工作,但可能效率不高。要使用,您必须使用数字参数调用,或者根本不使用参数。mclapplyregisterDoParallel
您可以查看boot包的源代码,了解如何使用mclapply或parLapply取决于您的平台。