r的future包提供了一种实现多线程并行计算的接口,但有时候在使用时,我发现r启动了比我设定的多得多的计算资源。
简单举一个例子:
data = data.table(
v1 = rnorm(1e8),
v2 = sample(LETTERS, size = 1e8, replace = TRUE)
)
library(future.apply)
plan(multisession, workers = 10)
rv = future_lapply(split(data, data$v2), function(x) {
data.table(
mean = mean(x$v1),
sd = sd(x$v1)
)
})
rv
上面我启用了10个线程(workers)对数据进行处理,但实际运行的时候CPU的资源图可以会类似下面这样:
有时候计算很密集的话,系统的全部CPU都会被占满。
在很久之前我就问过future包的作者,讨论在:https://github.com/HenrikBengtsson/future/issues/343
R语言大神任坤做了一段非常好的解释:
理解起来就是:
如@mxblsdl展示的例子,就可以手动进行设定解决这样的问题,即并行计算的函数开头设定仅只使用单线程(这样就变成了 4x1 = 4)。