gpt4 book ai didi

r - R : how to find the place of maximum memory usage? 中的内存分析

转载 作者:行者123 更新时间:2023-12-05 07:18:35 26 4
gpt4 key购买 nike

我的代码一次最多占用 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 的地方。

  1. 我尝试使用 Rprofprofvis 进行内存分析,但是 both seem to show different information (这似乎没有记录,请参阅 my other question )。也许我需要使用不同的参数(或使用不同的工具?)。

  2. 我一直在查看 Rprofmem...但是:

最佳答案

My code eats up to 3GB of memory at a single time.

虽然看起来您的代码通过调用一个函数一次消耗了大量 RAM,但您可以通过使用 RStudio 的内置分析来查看函数(及其子调用)的实现细节来分解内存消耗(基于profvis)查看执行时间和粗略的内存消耗。例如。如果我使用我的演示代码:

  # graf code taken from the tutorial at
# https://rawgit.com/goldingn/intecol2013/master/tutorial/graf_workshop.html
library(dismo) # install.packages("dismo")
library(GRaF) # install_github('goldingn/GRaF')

data(Anguilla_train)

# loop to call the code under test several times to get better profiling results
for (i in 1:5) {

# keep the first n records of SegSumT, SegTSeas and Method as covariates
covs <- Anguilla_train[, c("SegSumT", "SegTSeas", "Method")]

# use the presence/absence status to fit a simple model
m1 <- graf(Anguilla_train$Angaus, covs)
}

使用Profile > Start Profiling 菜单项开始分析,获取上面的代码并通过上面的菜单停止分析。

Profile > Stop Profiling 之后,RStudio 将结果显示为 Flame Graph,但您要查找的内容隐藏在配置文件结果的 Data 选项卡中(我已经展开所有显示大量内存消耗的函数调用):

enter image description here

memory 列中的数字表示为每个被调用函数分配(正数)和释放(负数)的内存,值应包括整个子调用树的总和+内存直接在函数中使用。

My goal is to minimize the maximum memory allocated at any single time.

你为什么要这么做?您是否内存不足或怀疑重复的内存分配导致执行时间过长?

高内存消耗(或重复分配/取消分配)通常伴随着缓慢的执行性能,因为复制内存需要时间。

因此,根据您的优化目标查看MemoryTime 列,以找到具有高值的函数调用。

如果您查看GRaF 包的源代码,您可以在graf.fit.laplace 中找到一个循环。调用“慢速”R 内部函数的函数(最多 50 次“牛顿迭代”)在包本身中实现(如 cov.SE.d1)。

现在您可以尝试为这些函数找到更快(或更少内存消耗)的替代品...(抱歉,我在这里无能为力)。

PS: profvis 在内部使用 Rprof 因此通过定期探测当前内存消耗并计算它来收集分析数据当前事件的函数(调用堆栈)。

Rprof 有局限性(主要不是准确的分析结果,因为垃圾收集器在不确定的时间触发并且释放的内存归因于下一个探测间隔中断停止的函数并且它确实 < strong>不识别通过绕过 R 的内存管理 API 的 C/C++ 代码/库从操作系统直接分配的内存)。它仍然是内存和性能问题的最简单且通常足够好的指示...

有关 profvis 的介绍,请参阅:对于 https://rstudio.github.io/profvis/

关于r - R : how to find the place of maximum memory usage? 中的内存分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250531/

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