【发布时间】:2020-08-05 18:33:17
【问题描述】:
我经常运行占用大量 RAM 的代码,并且可能需要长达一个小时才能给出输出。通常,我会花半个小时来运行这样的代码,我会担心出现问题。有什么方法可以让 R 向我保证还没有任何错误?我想我可以将里程碑放入代码本身,但我想知道 R(或 RStudio)中是否有任何东西可以在运行时自动完成这项工作。例如,查看代码使用了多少内存会很方便,因为这样我就会放心,只要我看到内存使用量显着变化,它仍然可以工作。
【问题讨论】:
-
你可以添加一个进度条作为指示器。此外,您还可以使用 stopifnot() 语句,如果出现问题则停止运行循环。
-
“使用内存”不是一个安全的(或好的,IMO)衡量标准,表明事情仍在进行中;例如,由于适当地扩展矩阵或框架,R 可能会消耗更多内存......或者它可能正在爆炸内存并即将崩溃 OOM。我所知道的唯一方法知道您的代码仍在推进它以放入某种形式的手动指示器,无论是使用
utils::txtProgressBar(或类似的包)之类的东西,还是一些日志记录,例如message(...)或logger包。 -
我个人是
logger包的粉丝,在昂贵的区域注入了几个logger::log_debug或logger::log_trace,所以我知道事情正在取得进展,而logger::log_info在顶级位置. -
@RYoda 有时是,但通常不是。它通常是一个用户编写的函数,其中包含许多函数。
-
我猜主要是因为“记录”和“进度指示”略有不同。我使用的另一种技术是添加
message(".",appendLF=FALSE),它在循环进行时在屏幕上提供.的无CRLF 字符串。对于快速移动,我会经常使用诸如i <- i+1; if (i%%100 == 0) message(".",appendLF=TRUE)之类的计数器。但在我看来,这似乎更像是一个 hack,而不是你问 “R 中是否有任何东西可以自动完成这项工作”。这也没有表明内存使用情况,我怀疑只有分析将在 R 中支持(当前)。