gpt4 book ai didi

r - 如何阻止 R 离开僵尸进程

转载 作者:行者123 更新时间:2023-12-04 15:22:23 24 4
gpt4 key购买 nike

这是一个可重现的小例子:

library(doMC)
library(doParallel)
registerDoMC(4)
timing <- system.time( fitall <- foreach(i=1:1000, .combine = "c") %dopar% {
print(i)
})

我启动 R并查看进程表:
> system("ps -efl")
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S chbr 1 0 5 80 0 - 21399 wait 10:58 ? 00:00:00 /usr/local/lib/R/bin/exec/R --no-save --no-restore
0 S chbr 9 1 0 80 0 - 1113 wait 10:58 ? 00:00:00 sh -c ps -efl
0 R chbr 10 9 0 80 0 - 4294 - 10:58 ? 00:00:00 ps -efl

如果我使用上述简单的 for 循环 doMCdoParallel留下僵尸进程。 ps -efl 的输出运行循环后:
> system("ps -efl")
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S chbr 1 0 4 80 0 - 25256 wait 11:00 ? 00:00:00 /usr/local/lib/R/b
1 Z chbr 10 1 0 80 0 - 0 exit 11:00 ? 00:00:00 [R] <defunct>
0 S chbr 12 1 0 80 0 - 1113 wait 11:00 ? 00:00:00 sh -c ps -efl
0 R chbr 13 12 0 80 0 - 4294 - 11:00 ? 00:00:00 ps -efl

如果我重复循环而不发出 registerDoMC(4)再次没有额外的僵尸进程被创建。但是,如果我发出 registerDoMC(4)一个额外的僵尸进程被创建:
> system("ps -efl")
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S chbr 1 0 0 80 0 - 25554 wait 11:00 ? 00:00:01 /usr/local/lib/R/b
1 Z chbr 21 1 0 80 0 - 0 exit 11:02 ? 00:00:00 [R] <defunct>
1 Z chbr 22 1 0 80 0 - 0 exit 11:02 ? 00:00:00 [R] <defunct>
0 S chbr 26 1 0 80 0 - 1113 wait 11:03 ? 00:00:00 sh -c ps -efl
0 R chbr 27 26 0 80 0 - 4294 - 11:03 ? 00:00:00 ps -efl

这就是我认为它可能是 doMC这是在做不应该做的事情。如果 doMC 导致了这种情况,有没有办法停止 doMC将僵尸进程抛在脑后? ( stopCluster() 不起作用,因为首先没有创建集群。)
> sessionInfo()
R Under development (unstable) (2014-08-16 r66404)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_IE.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_IE.UTF-8 LC_COLLATE=en_IE.UTF-8
[5] LC_MONETARY=en_IE.UTF-8 LC_MESSAGES=en_IE.UTF-8
[7] LC_PAPER=en_IE.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_IE.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] parallel stats graphics grDevices utils datasets methods
[8] base

other attached packages:
[1] doParallel_1.0.8 doMC_1.3.3 iterators_1.0.7 foreach_1.4.2

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.2.0

最佳答案

这真的与 foreach 或 doMC 无关;正如史蒂夫韦斯顿在回答其他 StackOverflow 查询时指出的那样,doMC 本质上只是 mclapply 的包装器,您可以看到通过简单调用 mclapply 创建的僵尸进程:

library(parallel)
mclapply(rep(5,4), rnorm)

在我的系统上,这留下了两个僵尸进程:
[richcalaway@richcalaway-pc ~]$ ps -efl | grep defunct
1 Z 1660945517 28701 28624 0 77 0 - 0 exit 12:00 pts/1 00:00:00 [R] <defunct>
1 Z 1660945517 28702 28624 0 78 0 - 0 exit 12:00 pts/1 00:00:00 [R] <defunct>
0 S 1660945517 28704 28308 0 78 0 - 15306 pipe_w 12:00 pts/2 00:00:00 grep defunct

在正常情况下,这些僵尸进程不会造成任何麻烦,它们会在 R session 结束时消失。您可以通过使用 doParallel 和 fork 集群而不是使用 doMC 来避免它们。

干杯,

丰富的卡拉威

首席项目经理

革命分析

关于r - 如何阻止 R 离开僵尸进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25348607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com