【问题标题】:R - Run source() in backgroundR - 在后台运行 source()
【发布时间】:2013-01-08 15:38:45
【问题描述】:

我想从 R 控制台在后台执行 R 脚本。

从控制台,我通常将 R 脚本作为 source('~/.active-rstudio-document') 运行 我必须等到脚本完成才能继续我的其余工作。 而不是这个,我希望 R 在后台运行,同时我可以在控制台中继续我的工作。 当 R 完成源命令时,我也应该以某种方式得到通知。 这在 R 中可能吗?

这可能非常有用,因为我们经常看到工作需要很长时间。

PS - 我希望源脚本在相同的内存空间而不是新的内存空间中运行。因此,像 fork , system 等解决方案对我不起作用。我正在查看是否可以将 R 脚本作为单独的线程而不是单独的进程运行。

【问题讨论】:

  • 这里的问题是:您需要“现在”还是“以后”的脚本输出?如果您正在做的工作不需要它,请稍后运行该脚本。如果您正在做的工作取决于输出,那么您无论如何都必须等到它完成。如果它是一个完全独立的任务,则在它自己的 R 实例中运行它,并让您的操作系统(或管理程序,或等效)进行内存交换。
  • 我现在需要输出吗 - 是的,但我不想等到它完成,我还不如在两者之间提交其他工作。为什么我不能将它作为单独的 R 实例运行 - 因为有一些东西加载到主内存中,我不想再次加载。

标签: r background


【解决方案1】:

您可以使用system() 和 Rscript 将您的脚本作为异步后台进程运行:

system("Rscript -e 'source(\"your-script.R\")'", wait=FALSE)

在脚本结束时,您可以使用save.image() 保存对象以便稍后加载它们,并使用cat() 通知其完成:

...
save.image("script-output.RData")
cat("Script completed\n\n")

希望这会有所帮助!

【讨论】:

  • 看起来不错,但这不会占用另一个内存空间吗?如果是这样,这对我来说不是解决方案。我希望源作为线程而不是单独的进程运行,因为有许多数据加载到函数需要访问的主内存中。
  • R 是单线程的。如果您愿意,Revolution Analytics (www.revolutionanalytics.com) 有 R 的商业多线程版本。但是您确定需要它吗?我的意思是你的脚本可以自己加载它需要的数据,我猜你只需要处理脚本的最终输出,而不是任何中间输出。
  • R 是用 C 语言编写的,外加一些 Fortran 语言。而且我不认为多线程可以在包级别实现。无论如何,您的问题是关于并行化任务,我认为您没有理由不能为此使用单独的 R 进程。无论如何,每个子任务的输入/输出都需要同步,您可以使用save.image()load() 将输入发送到每个 R 进程并从每个 R 进程获取输出。我一直这样做......
  • 后台进程完成的信号是如何工作的? cat 写入标准输出,如果使用 wait=FALSE,则不会在 R 变量中捕获
  • 如果您传递系统命令来运行脚本。你只需要Rscript the_script.R源不是必需的。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2015-03-29
  • 2021-04-06
  • 2021-06-12
  • 2011-08-19
  • 2011-12-28
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多