微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中“暂停”正在运行的计算并在不同的日期恢复它

如何解决在 R 中“暂停”正在运行的计算并在不同的日期恢复它

假设我在 R 中有大量计算。由于某种原因(代码优化不当、计算量大、计算机速度慢等),这个计算需要几天时间。

我想在多天内拆分 R 中的计算(可能会关闭机器),从我上次启动 R 时中断的地方继续。我该怎么做?

例如,假设我想计算 1 亿的平均值。这个平均值是通过对每个值求和并除以 100000000 来手动计算的。我的计算机每天限制为 100 万次计算而不会过热,我必须关闭计算机并在第二天重新启动。总共需要大约 100 天。

这是我的示例代码

total <- 0
for (k in 1:10^8) total <- total + k
print(total/1000^8)

我在想的是输出一个文本文件,给出当前索引和当前总数。然后根据文本文件中的信息恢复。类似的东西:

total <- totalFromText
start <- lastIndexFromText
end <- start + 10^6
for (k in start:end) total <- total + k

有没有更好的方法来做到这一点?无论如何要在 R 中暂停正在运行的计算?

解决方法

您可以在 R 本身中暂停 R 进程,例如,Sys.sleep,或者您可以在操作系统级别暂停 R 进程。在 Linux 上,您可以查找 R 进程的 pid,然后运行 ​​kill -STOP <pid> 暂停进程并运行 kill -CONT <pid> 恢复它。您可以找到完整的文档 here

但在您的情况下,我认为最好的解决方案是在您的代码中创建检查点:将代码分成更小的块,并在每个块运行后保存输出、对象或计算状态。

对于长时间运行的计算,检查点是一个很好的做法,无论您是否想终止进程:它保证如果在计算完成之前发生任何事情(计算机崩溃或任何其他失败原因),您不必从头开始,可能会浪费大量计算时间。

HPC 集群有很好的检查点机制,可以在运行的进程本身之外设置,因为它们被构建来执行经常运行数天的非常大的计算,因为可能会发生故障,并且因为它们通常有调度程序限制每个用户的时间可以在任何一天运行计算。

然而,当你在自己的机器上运行它时,你必须在 R 中实现这些。

一种选择是将代码的每个块的输出保存为带有 .rdssaveRDS() 文件中的 R 对象。其他选项是使用 save()save.image() 将所有 R 对象或所有工作区分别保存在 .RData 文件中。

然后,您可以根据您希望 R 进程运行多长时间来一个一个地启动块(例如,如果它们在不同的脚本中)。或者你可以启动整个事情并在需要时杀死它。在 Linux 上,杀死 R 进程的一种干净方法是使用 SIGTERMkill -15 <pid>

第二天,当您想重新开始计算时,您可以读取上次结果,该结果存储在带有 .rdsreadRDS 文件中(或者类似的,如果您选择将输出保存在不同的方式)并开始下一个块。

至于您给出的特定示例:将您的循环分成几个较小的循环,其大小取决于您想要拥有多少个检查点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?