gpt4 book ai didi

r - `Rprof`的内存分析输出的解释

转载 作者:行者123 更新时间:2023-12-04 04:24:06 29 4
gpt4 key购买 nike

我正在尝试使用分析来查看我的代码的哪一部分负责 3GB 的最大内存使用量(如 gc() 报告的最大已用内存统计数据, see here how )。我正在运行这样的内存分析:

Rprof(line.profiling = TRUE, memory.profiling = TRUE)
graf(...) # ... here I run the profiled code
Rprof(NULL)
summaryRprof(lines = "both", memory = "both")

输出如下:
$by.total
total.time total.pct mem.total self.time self.pct
"graf" 299.12 99.69 50814.4 0.02 0.01
#2 299.12 99.69 50814.4 0.00 0.00
"graf.fit.laplace" 299.06 99.67 50787.2 0.00 0.00
"doTryCatch" 103.42 34.47 4339.2 0.00 0.00
"chol" 103.42 34.47 4339.2 0.00 0.00
"tryCatch" 103.42 34.47 4339.2 0.00 0.00
"tryCatchList" 103.42 34.47 4339.2 0.00 0.00
"tryCatchOne" 103.42 34.47 4339.2 0.00 0.00
"chol.default" 101.62 33.87 1087.0 101.62 33.87
graf.fit.laplace.R#46 85.80 28.60 3633.2 0.00 0.00
"backsolve" 78.82 26.27 1635.2 58.40 19.46

我该怎么解释 mem.total ?它是什么,它的单位是什么?我试着看了一下文档,即 ?Rprof?summaryRprof ,但似乎没有很好的记录:-/

编辑: Here他们说 Rprof “以固定的时间间隔探测 R 的 总内存使用量 ”。但这不适合 50GB,这远远超出了我的内存能够容纳的范围! (现在 8GB 物理 + 12 GB 页面文件)。

同样,正如 R Yoda 所指出的, ?summaryRprof说 memory = "both"表示"总内存的变化"。但它究竟是什么(是总内存还是总内存的变化),它如何与 50GB 数字匹配?

编辑:profvis 中进行了相同的分析- 当我将鼠标悬停在 50812 上时,它会显示“内存分配 (MB)”,并将鼠标悬停在靠近该垂直线“峰值内存分配和释放百分比”的黑条上。不确定这意味着什么......这就像 50 GB,这意味着这可能是所有分配的总和(??)......绝对不是峰值内存使用量:

enter image description here

最佳答案

?summaryRprof说:

If memory = "both" the same list but with memory consumption in Mb in addition to the timings.



所以 mem.total以 MB 为单位

With memory = "both" the change in total memory (truncated at zero) is reported [...]



您有 8 GB RAM + 12 GB 交换,但 mem.total宣称您已经使用了 50 GB?

因为是 两个后续探测之间的聚合增量 ( Rprof 在固定时间间隔拍摄的内存使用快照:如果在函数 f 中执行时进行了探测,则将最后一次探测的内存使用增量添加到 f 的 mem.total 中)。

内存使用增量可能为负 但我从未见过负面 mem.total值所以我猜(!)只有正值被添加到 mem.total .

这可以解释您看到的 50 GB 总使用量:它不是单个时间点内分配的内存量,而是整个执行时间内的聚合内存增量。

这也 解释了 gc 的事实仅将 3 GB 显示为“最大使用量 (Mb)” :内存被多次分配和释放/解除分配,这样您就不会遇到内存压力,但这会在 CPU 的计算逻辑之上花费大量时间(在 RAM 中移动如此多的数据会使所有缓存无效,因此速度很慢)适用。

这个摘要(恕我直言)似乎也隐藏了 的事实。垃圾收集器 (gc) 在不确定的时间点启动 清理释放的内存。

由于 gc 开始是惰性的(非确定性的),恕我直言,将负内存增量归因于刚刚探测的单个函数是不公平的。

我会解释mem.totalmem.total.used.during.runtime这可能是该列的更好标签。
profvis有更详细的内存使用情况摘要(正如您在问题的屏幕截图中所见):它还汇总了负内存使用量增量(已释放的内存),但 profvis documentation还警告了缺点:

The code panel also shows memory allocation and deallocation. Interpreting this information can be a little tricky, because it does not necessarily reflect memory allocated and deallcated at that line of code. The sampling profiler records information about memory allocations that happen between the previous sample and the current one. This means that the allocation/deallocation values on that line may have actually occurred in a previous line of code.



更详细的答案需要更多的研究时间(我没有)
- 查看 C 和 R 源代码
- 理解(复制) summaryRprof的聚合逻辑基于 Rprof 创建的数据文件
Rprof数据文件( Rprof.out )如下所示:
:376447:6176258:30587312:152:1#2 "test" 1#1 "test2"

前四个数字(用冒号分隔)表示(见 ?summaryRprof)
- R_SmallVallocSize:R堆上小块中的向量内存[桶数]
- R_LargeVallocSize:大块中的向量内存[桶数](来自malloc)
- R 堆上节点的内存
- 调用内部函数的次数 duplicate在时间间隔内(用于复制向量,例如在函数参数的先写复制语义的情况下)

字符串是函数调用堆栈。

只有前两个数字与计算当前内存使用量(向量)相关,以 MB 为单位:
TotalBuckets = R_SmallVallocSize + R_LargeVallocSize
mem.used = TotalBuckets * 8 Bytes / 1024 / 1024
# 50 MB in the above `Rprof` probe line:
# (376447 + 6176258) * 8 / 1024 / 1024

详情 Vcells?Memory .

顺便说一句:我想试试 summaryRProf(memory = "stats", diff = F)获取当前内存摘要,但我在 Ubuntu 上收到 R3.4.4 64 位的错误消息:
Error in tapply(seq_len(1L), list(index = c("1::#File", "\"test2\":1#1",  : 
arguments must have same length

你能重现这个(看起来“统计数据”坏了)?

关于r - `Rprof`的内存分析输出的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250126/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com