r - R : how to find the place of maximum memory us

我的代码一次最多占用 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...但是:

    • in the profmem vignette他们写道:“使用 utils::Rprofmem() 无法量化给定时间的总内存使用量,因为它仅记录分配,因此不反射(reflect)垃圾收集器完成的释放。”
    • 如何输出Rprofmem的结果?这个来源不言自明:"Summary functions for this output are still being designed" .

最佳答案

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 选项卡中(我已经展开所有显示大量内存消耗的函数调用):

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 有局限性(主要不是准确的分析结果,因为垃圾收集器在不确定的时间触发并且释放的内存归因于下一个探测间隔中断停止的函数并且它确实 不识别通过绕过 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/

相关文章:

asp.net-core-webapi - .NET Core 3 API - 在一个请求后停止工作

aws-lambda - 如何使用 CloudFormation 添加订阅过滤器?

r - 在 R 中使用 RCurl 下载 NASA 卫星数据

angular - 运行 karma 测试时出现错误无法读取 null 的属性 'extras'

python - TensorFlow 的可微分汉明损失

reactjs - React Native - SetTimeout() 不工作。 t.apply

objective-c - 无法编译使用 Objective-C 包的 Swift 包

angular - Ionic Barcode Scanner 插件关闭按钮

firebase - 使用 react-native-firebase 在 React Native

c# - 是否可以动态更改 ToolbarItem 的图标?