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

测量R中的峰值内存使用率,r,performance,memory,R,Performance,Memory,我重写这个问题是为了澄清我在寻找什么 我希望在RStudio中监视内存使用情况,以避免集群上出现内存不足错误。我正在寻找一种计算峰值内存使用量的方法,包括全局变量和局部变量。例如,峰值内存使用应该考虑函数和应用循环中的中间变量 编辑:这份赏金即将到期,但我仍然没有找到我想要的东西。我想要的东西,可以不断监测内存使用情况,而不仅仅是打印到控制台 gc(reset = T) sum(gc()[, "(Mb)"]) # 172Mb lapply(1:3, function(x)

我重写这个问题是为了澄清我在寻找什么

我希望在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!
gc(重置=T)
总和(gc()[,“(Mb)”)#172Mb
lappy(1:3,函数(x){

mx您可以使用
gc
功能进行此操作

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

> 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(重置=真) 已用(Mb)gc触发器(Mb)最大已用(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)#应向GC(在我的机器上)请求512 Mio >gc() 已用(Mb)gc触发器(Mb)最大已用(Mb) Ncells 318677 17.1 654385 35.0 318834 17.1 Vcells 67738785 516.9 318092551 2426.9 67739236 516.9 >memInfo memInfo[11]#最大净电量 [1] 17.1 >memInfo[12]#最大Vcells [1] 516.9 >rm(a)#`a`可以由GC从此点删除 >gc(重置=真)#命令重置gc信息,包括最大 已用(Mb)gc触发器(Mb)最大已用(Mb) Ncells 318858 17.1 654385 35.0 318858 17.1 Vcells 630322 4.9 162863387 1242.6 630322 4.9 >memInfo memInfo[11] [1] 17.1 >memInfo[12]#已正确重置最大值 [1] 4.9

在本例中,我们可以看到GC在围绕
runif
调用的两个GC调用之间分配了最多
516.9-4.9=512 Mb
(这与预期结果一致).

lappy
返回的对象仅具有488字节的权重,因为它的摘要是:垃圾收集在平均值计算后删除了中间对象。
help(“内存”)
提供了有关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, function(x) {
  mx <- replicate(10, 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
#平均值计算
gc(重置=T)
#>已用(Mb)gc触发器(Mb)最大已用(Mb)
#>Ncells 405777 21.7 831300 44.4 405777 21.7
#>Vcells 730597 5.6 8388608 64.0 730597 5.6
总和(gc()[,“(Mb)”)
#> [1] 27.3
l[1]“使用的内存:272.26”
#>[1]“使用的内存:272.26”
对象大小(l)
#>488字节
##无平均值计算:
gc(重置=T)
#>已用(Mb)gc触发器(Mb)最大已用(Mb)
#>Ncells 464759 24.9 831300 44.4 464759 24.9
#>Vcells 864034 6.6 2999470228.9 864034 6.6
gcinfo(T)
#>[1]错误
总和(gc()[,“(Mb)”)
#> [1] 31.5
l[1]“使用的内存:272.27”
#>[1]“新对象大小:80000216”
#>[1]“使用的内存:348.58”
#>[1]“新对象大小:80000216”
#>[1]“使用的内存:424.89”
#>[1]“新对象大小:80000216”
#>[1]“使用的内存:501.21”
对象大小(l)
#>32000944字节
总和(gc()[,“(Mb)”)
#> [1] 336.7
由(v0.3.0)于2020年8月20日创建


如果不是返回
意味着
而是返回整个对象,那么内存使用的增加是显著的。

我在包
peakRAM
中找到了我要查找的内容

这个包使得监控使用的RAM总量和峰值变得容易,这样开发人员就可以快速识别并消除需要RAM的代码


mem实际上我不认为这个方法考虑了函数和应用循环中的中间值,请看上面我的新测试。它考虑了不是由gc管理的内存吗?比如malloc而不是R_alloc?@jangorecki不,分配给
malloc
的内存不应该被gc看到,因为它没有被明确要求执行o、 但是,AFAIK大多数R库持久对象不是使用普通的
malloc
分配的,因为不会收集对象(除非在退出时或用户手动)。请注意,在R的未来版本中,它可能会发生变化,因为4.0版似乎在尝试引用计数。是否有一种方法用于监视内存使用情况,从而考虑垃圾收集?可能是RStudio之外的内容?也许可以查看
帮助(“内存”)
。要监控当前内存使用情况,您可以打印
内存。大小
,查看我的编辑您在什么平台上?您可以使用一系列工具监控Linux上的内存使用情况。我在Mac上使用RStudio。最终的方法是使用操作系统工具。在R C中,您可以使用R_alloc或malloc,后者没有被R跟踪。@jangorecki这可能是w我要找的帽子,我要做些研究看看。
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!