【问题标题】:On open, Rstudio starts many processes (started with parallel package in previous session) -- how to kill them?打开时,Rstudio 启动许多进程(在上一个会话中从并行包开始)——如何杀死它们?
【发布时间】:2015-08-19 10:11:47
【问题描述】:

我已经阅读了这个 SO 问题和答案 (R parallel computing and zombie processes),但它似乎并不能完全解决我的情况。

我有一台运行 Mac OS X 10.10.3、R 3.2.0 和 RStudio 0.99.441 的 4 核 MacBook Pro。

昨天,我正在试用“foreach”和“doParallel”包(我想在我正在开发的包中使用它们)。我这样做了:

cl <- makeCluster(14)
registerDoParallel(cl)

a <- 0
ls <- foreach(icount(100)) %dopar% {
    b <- a + 1
}

我很清楚,在我的 4 核机器上拥有 14 个进程没有意义,但该软件实际上将在 16 核机器上运行。这时我的电脑停了下来。我打开活动监视器,发现 16 个(或更多,也许?)R 进程。我试图强迫他们从活动监视器中退出——没有运气。我关闭了 RStudio,这杀死了所有的 R 进程。我重新打开了 RStudio 并重新启动了所有 R 进程。我重新启动计算机并重新启动 RStudio,然后重新启动所有 R 进程。

如何在不重新启动所有这些进程的情况下启动 RStudio?

编辑:我忘了提到我还重建了我当时正在处理的包(所有进程可能在构建期间一直在运行)

EDIT2:另外,我不能 StopCluster(cl) 因为 cl 不再在环境中...我关闭了那个 R 会话。

EDIT3:当我打开 R.app(R 提供的 R GUI)或在终端中打开 R 时,不会出现此类问题。所以我觉得肯定是RStudio相关的。

EDIT4:在打开 RStudio 和启动所有这些不需要的进程之间似乎存在随机延迟。 15 秒到 2 分钟之间。

EDIT5:似乎只有在我打开启动它们的项目后才会启动这些进程。

EDIT6:我一直在 .Rproj.user 文件中挑选要删除的内容。我删除了 ctx、pcs 和 sdb 中的所有文件(但没有删除目录)。问题仍然存在。

EDIT7:当我在命令行运行“killall R”时,它会杀死所有这些进程,但是当我重新启动 RStudio 并重新打开项目时,所有进程都会重新启动。

EDIT8:我使用“killall -s R | wc -l”发现R进程的数量在项目打开时不断增长。它升至 358,然后我运行“killall R”,因为我的计算机发出可怕的声音。

EDIT9:RStudio 目前完全无法使用。每次我“killall R”时,它都会在 15 秒内重新启动所有进程。

EDIT10:当我启动一个同时启动大量 R 进程的构建时——最后一次检查为 109。当构建显示“为延迟加载准备包”时,这些过程都会启动。此时计算机几乎停止运行。

EDIT11:我删除了 .Rproj 文件(实际上只是将其作为备份移动)和 .Rproj.user 目录。我在 RStudio 中使用了“从目录创建项目”。当我打开那个新项目时,我仍然得到相同的行为。当我打开一个不包含在 .Rproj 文件或 .Rproj.user 目录中的任何地方的项目时,RStudio 会做什么!?我花了一整天的时间来解决这个问题....:(

【问题讨论】:

  • 查看此处以将 rstudio 重置为新状态:support.rstudio.com/hc/en-us/articles/…
  • 杰,谢谢你的建议。我做了该页面上描述的操作,它确实重置了我的 RStudio 设置(布局、外观等),但是当我启动 RStudio 时,它仍然会启动所有不需要的进程。
  • 我只是补充一下——我认为您的建议可能是一个答案(而不是评论)。仅仅因为它简单/简短并不意味着它不可能是完全正确和最有用的响应!
  • 我刚刚在我的 macbook pro 上使用makeCluster(32) 运行了此程序,并且 (i) 我的计算机没有死机(实际上代码几乎立即完成)和 (ii) 在重新启动 RStudio 后 R 进程没有再次出现。
  • @Roland,也许它与构建包有关?

标签: r rstudio parallel-foreach doparallel


【解决方案1】:

最好的猜测——最新版本的 RStudio 试图在幕后做一些工作来开发一个自动完成数据库,基于它在项目中打开的文件中检测到的 library()require() 调用。为此,它启动新的 R 进程,加载这些包(使用 library()),然后返回该包提供的所有对象的集合。

您是否正在加载某些具有复杂.onLoad() 操作的包? RStudio 中的这个引擎有可能在幕后运行 R 进程中的引擎,但由于某种原因卡住了,让您使用这些(可能是陈旧或繁忙的)R 进程。

作为参考,here 报告了一些类似的问题。

【讨论】:

  • 凯文——感谢您的洞察力。我敢打赌,这就是这些。但是我正在处理的包有很多依赖项,所以也许最好的解决方案就是回到以前版本的 RStudio?不过,我确实喜欢新 RStudio 中的代码完成功能。
  • 如果您恰好缩小了问题范围,请在support.rstudio.com 提交错误报告。谢谢!
【解决方案2】:

以下是最终修复它的原因:

删除我构建的包(二进制文件,我相信...我在 RStudio 的“包”部分中单击了其名称右侧的“x”)。

重建它,用

library(parallel)

注释掉了。

【讨论】:

  • 为什么您的包裹中有library 电话?在您的说明文件中说明依赖关系。
  • 完全公平。如原始问题中所述,我只是在玩并行包以查看它是如何工作的。我有一个名为“temp.R”的文件,在那里我正在做一些“hello world”类型的东西。活到老,学到老。也许诀窍是调用该文件“temp.txt”或“.R”以外的任何文件,这样,如果我想在文件存在时重建,它会被忽略。或者,只需将该文件添加到 .buildignore!
【解决方案3】:
unloadNamespace("doParallel")

将杀死registerDoParallel启动的无名工人

如果你有集群的名字,你可以使用:

stopCluster(cl)

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 2015-08-30
    • 2012-07-01
    • 2010-10-07
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多