【发布时间】:2020-02-03 15:01:56
【问题描述】:
我的代码一次最多占用 3GB 内存。我用gc()弄明白了:
gc1 <- gc(reset = TRUE)
graf(...) # the code
gc2 <- gc()
cat(sprintf("mem: %.1fMb.\n", sum(gc2[,6] - gc1[,2])))
# mem: 3151.7Mb.
我猜这意味着有一次,一次分配 3151.7 MB。
我的目标是最小化在任何时候分配的最大内存。 我如何确定我的代码的哪一部分负责最大使用这 3GB 内存?即一次性分配那 3GB 的地方。
我尝试使用
Rprof和profvis进行内存分析,但是both seem to show different information(这似乎没有记录,请参阅my other question)。也许我需要将它们与不同的参数一起使用(或使用不同的工具?)。-
我一直在看
Rprofmem...但是:-
in the profmem vignette 他们写道:“
utils::Rprofmem()无法量化给定时间的总内存使用量,因为它只记录分配,因此不反映垃圾收集器完成的释放。” -
Rprofmem的结果如何输出?此消息来源不言自明:"Summary functions for this output are still being designed"。
-
in the profmem vignette 他们写道:“
【问题讨论】:
-
由于
Rprof定期中断执行并获取调用堆栈快照,包括。使用的内存不够准确,无法找到导致高内存消耗的代码行(分配可能发生在中间,内存在“不可预测”的时间被 gc 释放) -
您是否尝试过使用
Rprofmem在内存分配发生时跟踪它们(不是间隔快照)?见cran.r-project.org/doc/manuals/… -
@RYoda 是的,我一直在查看
Rprofmem... 但是 1) in the profmem vignette 他们写道:“使用utils::Rprofmem()无法量化总内存使用量给定时间,因为它只记录分配,因此不反映垃圾收集器完成的释放。” 2)Rprofmem的结果如何输出?这个来源不言自明:"Summary functions for this output are still being designed" -
很好的发现,R 对最终用户来说(还)不是非常支持。恕我直言
Rprofmem是查找代码行的好方法,这些代码行(重复)分配内存会导致程序执行缓慢(在这种情况下,当前分配的总内存是次要的)。不过,我从未尝试过聚合输出(是否有任何软件包?)恕我直言,如果我想找到 gc 无法释放的内存泄漏,释放是“唯一”重要的。 -
@RYoda yes :-) 但它来自 github 的最新版本:
install_github('goldingn/GRaF')。对不起,我仍然没有时间看你的详细答案,希望明天!
标签: r memory-profiling