如何在编译R包时使用并行make?

sg24os4d  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(96)

当直接使用make工具时,可以使用-j选项进行并行构建。
如何在使用install.packages()安装R软件包时使用并行构建?make由R调用,而不是由我调用,因此我无法将-j选项传递给它。在启动R之前设置export MAKE_FLAGS=-j4不起作用。我希望为我的R安装永久设置并行构建。

bnl4lu3b

bnl4lu3b1#

options(Ncpus=8)路由是单向的。在install.packages()中,您有Ncpus = getOption("Ncpus"),该选项描述为
Ncpus:用于并行安装多个源程序包的并行进程数。如果“Sys.getenv(“MAKE”,“make”)“指定的”make“命令接受参数”-k -j Ncpus“,则支持大于1的值。
我没有看到它列在update.packages()中,但它在我的Linux机器上的功能相同,因此构建通常是并行进行的。
简而言之,它使用多个包的并行构建,而不是只构建一个包的make -j ...。我也尝试过这种方法,但发现收益不那么引人注目。

tzcvj98z

tzcvj98z2#

给定n要使用的并行线程数。
要并行编译单个包的不同源文件,请执行以下操作:

Sys.setenv(MAKEFLAGS = paste0("-j",n))

字符串
要并行编译所有通过单个install.packages调用安装的不同包:

options(Ncpus = n)


要使用parallel::lcmlapply并行化apply类型函数,请执行以下操作:

options(mc.cores =  n)


您可以将这些选项放在$HOME/.Rprofile中,以便在R启动时加载它们。
如果您使用RStudio并在$HOME/.bashrc中导出了MAKEFLAGS,请注意.bashrc在RStudio启动和R会话时不是来源的。
最后你可以用

parallel::detectCores()


来查找操作系统的内核数量,

n <- max(parallel::detectCores() - 2L, 1L)


使用除两个以外的所有可用内核。

相关问题