R sys.child 中的 system.time 和并行包为 0
Posted
技术标签:
【中文标题】R sys.child 中的 system.time 和并行包为 0【英文标题】:system.time and parallel package in R sys.child is 0 【发布时间】:2017-08-15 06:47:20 【问题描述】:我想在 R 中使用 system.time 来获取多核函数的总 CPU 时间。问题是 system.time 显然没有捕获由并行包产生的子进程花费的 CPU 时间。
library(doParallel)
cl <- makeCluster(2)
registerDoParalllel(2)
timings <- system.time(foreach(i = 1:2) %do% rnorm(1e8))
时间看起来像这样
> timings
user system elapsed
16.883 5.731 22.899
时间加起来。现在如果我使用并行处理:
timings <- system.time(foreach(i = 1:2) %dopar% rnorm(1e8))
> timings
user system elapsed
2.445 3.410 20.347
用户和系统时间只捕获主进程。具体查看时间[4] 和 [5] 显示 user.child 和 sys.child 时间为 0。
我必须做些什么来测量 R 中并行处理的总 CPU 时间?
注意:将集群启动代码移到 system.time 调用中并没有什么不同。
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 8 (jessie)
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
【问题讨论】:
查看https://www.r-bloggers.com/the-wonders-of-foreach/
。 user.child
列可能就是您要查找的内容
你是对的,user.child 列是有趣的列。但在这种情况下为 0。我从您共享的链接(谢谢!)和我自己的测试中了解到,使用 doMC 时会填充 user.child 和 sys.child ,但使用 doParallel 时不会填充(无论是在 PSOCK 还是在 FORK 模式下)。那么并行包根本不可能做到这一点吗?
【参考方案1】:
@chinsoon12 为我指明了正确的方向。 user.child 和 sys.child 仅在 registerDoParallel 创建集群时填充,例如
registerDoParalllel(cores = 2)
timings <- system.time(foreach(i = 1:2) %dopar% rnorm(1e8))
user.self sys.self elapsed user.child sys.child
timings 0.429 1.978 19.378 9.818 1.386
这就是为什么它在我没有通过 cl 变量手动启动和停止集群的情况下使用 doMC 开箱即用的原因。
【讨论】:
以上是关于R sys.child 中的 system.time 和并行包为 0的主要内容,如果未能解决你的问题,请参考以下文章