测量R中的峰值内存使用率

问题描述

我正在重写此问题,以澄清我在寻找什么

我想监视RStudio中的内存使用情况,以便避免在群集上出现内存不足错误。我正在寻找一种计算峰值内存使用率的方法,该方法包括全局变量和局部变量。例如,峰值内存使用量应考虑函数中的中间变量并应用循环。

编辑:该赏金即将到期,但我仍未找到所需的内容。我想要可以连续监视内存使用情况的东西,而不仅仅是打印到控制台。

gc(reset = T)
sum(gc()[,"(Mb)"]) # 172Mb

lapply(1:3,function(x) {
  mx <- replicate(10,rnorm(1e6)) # 80Mb object
  mean(mx)
})

sum(gc()[,"(Mb)"]) # 172Mb -- still the same!

解决方法

lapply返回的对象仅重488个字节,因为它已被汇总:垃圾回收在平均值计算后删除了中间对象。
help('Memory')提供有关R如何管理内存的有用信息。
特别是,您可以使用object.size()跟踪各个对象的大小,并使用memory.size()知道每个步骤使用了多少总内存:

# With mean calculation
gc(reset = T)
#>          used (Mb) gc trigger (Mb) max used (Mb)
#> Ncells 405777 21.7     831300 44.4   405777 21.7
#> Vcells 730597  5.6    8388608 64.0   730597  5.6
sum(gc()[,"(Mb)"]) 
#> [1] 27.3

l<-lapply(1:3,function(x) {
  mx <- replicate(10,rnorm(1e6)) # 80Mb object
  mean(mx)
  print(paste('Memory used:',memory.size()))
})
#> [1] "Memory used: 271.04"
#> [1] "Memory used: 272.26"
#> [1] "Memory used: 272.26"

object.size(l)
#> 488 bytes


## Without mean calculation :
gc(reset = T)
#>          used (Mb) gc trigger  (Mb) max used (Mb)
#> Ncells 464759 24.9     831300  44.4   464759 24.9
#> Vcells 864034  6.6   29994700 228.9   864034  6.6
gcinfo(T)
#> [1] FALSE
sum(gc()[,"(Mb)"]) 
#> [1] 31.5
l<-lapply(1:4,rnorm(1e6))
  print(paste('New object size:',object.size(mx)))
  print(paste('Memory used:',memory.size()))
  mx
})
#> [1] "New object size: 80000216"
#> [1] "Memory used: 272.27"
#> [1] "New object size: 80000216"
#> [1] "Memory used: 348.58"
#> [1] "New object size: 80000216"
#> [1] "Memory used: 424.89"
#> [1] "New object size: 80000216"
#> [1] "Memory used: 501.21"

object.size(l)
#> 320000944 bytes
sum(gc()[,"(Mb)"]) 
#> [1] 336.7

reprex package(v0.3.0)于2020-08-20创建

如果您返回整个对象而不是返回mean,则内存使用量的显着增加。

,

您可以使用gc函数。

实际上, gc函数提供了字段11和12中使用的当前和最大内存(在Mb中是关于文档的,但显然在{{1}中是}在我的机器上进行实践)。您可以使用参数 Mio 重置最大值。这是一个示例:

reset=TRUE

在此示例中,我们可以看到GC围绕> gc(reset=TRUE) used (Mb) gc trigger (Mb) max used (Mb) Ncells 318687 17.1 654385 35.0 318687 17.1 Vcells 629952 4.9 397615688 3033.6 629952 4.9 > a = runif(1024*1024*64) # Should request 512 Mio to the GC (on my machine) > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 318677 17.1 654385 35.0 318834 17.1 Vcells 67738785 516.9 318092551 2426.9 67739236 516.9 > memInfo <- gc() > memInfo[11] # Maximum Ncells [1] 17.1 > memInfo[12] # Maximum Vcells [1] 516.9 > rm(a) # `a` can be removed by the GC from this point > gc(reset=TRUE) # Order to reset the GC infos including the maximum used (Mb) gc trigger (Mb) max used (Mb) Ncells 318858 17.1 654385 35.0 318858 17.1 Vcells 630322 4.9 162863387 1242.6 630322 4.9 > memInfo <- gc() > memInfo[11] [1] 17.1 > memInfo[12] # The maximum has been correctly reset [1] 4.9 调用的两个gc调用之间最多分配了516.9 - 4.9 = 512 Mb(与预期结果一致)。

,

我在包peakRAM中找到了想要的东西。来自documentation

此软件包可轻松监视使用的总RAM和峰值RAM,以便开发人员可以快速识别并消除RAM过多的代码。

mem <- peakRAM({
  for(i in 1:5) {
    mean(rnorm(1e7))
  }
})
mem$Peak_RAM_Used_MiB # 10000486MiB

mem <- peakRAM({
  for(i in 1:5) {
    mean(rnorm(1e7))
  }
})
mem$Peak_RAM_Used_MiB # 10005266MiB <-- almost the same!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...