作者:fengzi199171 | 来源:互联网 | 2022-10-12 11:34
在包含对data.table
函数调用的R代码中分析内存的正确方法是什么?假设我要确定表达式期间的最大内存使用量。
该参考文献表明Rprofmem
可能不是正确的选择:https :
//cran.r-project.org/web/packages/profmem/vignettes/profmem.html
记录通过R的本机API的本机allocVector3()部分完成的所有内存分配,这意味着几乎所有的内存分配都被记录。R的垃圾收集器会在某些时候自动释放所有以这种方式分配的对象。profmem()不会记录垃圾收集事件。未记录的分配是由非R本机库或将内部代码Calloc()/ Free()用于内部对象的R包完成的分配。R垃圾收集器不处理此类对象。
data.table源代码包含对的大量调用Calloc()
,malloc()
因此这表明这Rprofmem
将无法衡量data.table
函数分配的所有内存。如果Rprofmem
不是正确的工具,那么Matthew Dowle怎么在这里使用它:R:循环遍历data.table中的列?
我发现了一个参考文献,提出了类似的潜在问题gc()
(可用于测量两次调用之间的最大内存使用量gc()
):https :
//r.789695.n4.nabble.com/Determining-the-maximum-memory-usage -of-a-function-td4669977.html
gc()是一个好的开始。在任务执行之前调用gc(reset = TRUE),在执行任务之后调用gc(),您会在此期间看到R占用的最大额外内存。(这不包括编译后的代码分配的内存,这在重新使用时很难测量。)
我没有发现任何暗示存在类似问题Rprof(memory.profiling=TRUE)
。这是否意味着即使不总是使用R API分配内存,该Rprof
方法data.table
仍然适用?
如果Rprof(memory.profiling=TRUE)
实际上不是该工作的正确工具,那是什么?
会ssh.utils::mem.usage
工作吗?