R 为向量分配的内存称为 Vcells(R 以 8 字节的倍数为向量分配空间),为其他对象分配的内存称为 Ncells(在 32 位系统上每个 28 个字节,在 64 位系统上每个 56 个字节)。在 R 会话开始之前,在 R 会话 gc() 函数输出中创建任何对象之前:
gc(verbose=TRUE, full=TRUE)
# Garbage collection 2 = 0+0+2 (level 2) ...
#13.4 Mbytes of cons cells used (41%)
#3.7 Mbytes of vectors used (6%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 249316 13.4 608371 32.5 407443 21.8
#Vcells 484528 3.7 8388608 64.0 1607721 12.3
已用列报告已分配的单元数,以下列报告总大小(以兆字节为单位)。gc 触发器列报告下一次垃圾回收何时发生。max used列报告自上次调用 gc() 函数以来使用的最大内存。因此,例如,如果我们创建一个新对象,我们将看到 gc() 输出的变化:
x <- as.list(1:10000)
y <- 1:100000
gc(verbose=TRUE, full=TRUE)
#Garbage collection 3 = 0+0+3 (level 2) ...
#13.9 Mbytes of cons cells used (43%)
#3.9 Mbytes of vectors used (6%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 259262 13.9 608371 32.5 407443 21.8
#Vcells 504438 3.9 8388608 64.0 1607721 12.3
创建一个带有浮点数的大向量,然后将其删除:
z <- seq(from=0.0, to=1.0, by=0.0000001)
gc(verbose=TRUE, full=TRUE)
#Garbage collection 6 = 0+0+6 (level 2) ...
#14.0 Mbytes of cons cells used (43%)
#80.2 Mbytes of vectors used (39%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 261151 14.0 608371 32.5 407443 21.8
#Vcells 10508970 80.2 26703045 203.8 20512469 156.5
rm(z)
gc(verbose=TRUE, full=TRUE)
#Garbage collection 8 = 0+0+8 (level 2) ...
#14.0 Mbytes of cons cells used (43%)
#3.9 Mbytes of vectors used (2%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 261391 14.0 608371 32.5 407443 21.8
#Vcells 509467 3.9 21362436 163.0 20512469 156.5
垃圾收集器恢复不再使用的内存。“gc trigger”列中的表中的上述值指定了触发 gc 的时间。如果您调用 gc() 函数,您可以强制垃圾收集器将内存返回给系统。
可以更改为 Ncells 或/和 Vcells 设置的最大值。请参阅https://stat.ethz.ch/R-manual/R-devel/library/base/html/Memory.html
此链接不仅提供有关 R 中的内存使用情况的深入信息,还提供有关垃圾收集器如何工作的一些见解在 R。
至于您关于 full=TRUE 选项的主要问题,根据 R 文档,如果您想要更准确的内存使用报告,则应使用此选项。它还强制执行完整的垃圾收集(因此可能需要更多时间)。否则,R 可能只执行部分垃圾回收,仅为最近分配的对象释放内存。
顺便说一句,正如您从最新版本的 R 文档 (?memory ) 中看到的那样,R 中内存管理的执行方式很大程度上取决于您拥有的操作系统。例如:在 Windows 上,--max-mem-size 选项(或环境变量 R_MAX_MEM_SIZE)设置最大(虚拟)内存分配:它的最小允许值为 32M。这旨在捕获分配过多内存的尝试,这可能导致其他进程耗尽资源。另请参阅 memory.limit。
同样,我会非常仔细地阅读 R (?memory) 中的内存主题文档。确保您阅读了与您在系统上使用的 R 版本相对应的版本,因为版本之间存在一些变化。
还有 2 个链接值得阅读以了解垃圾收集器如何在 R 中工作的更多信息:
http: //homepage.stat.uiowa.edu/~luke/R/barrier.html
http://homepage.stat.uiowa。 edu/~luke/R/gengcnotes.html
由于调用垃圾收集器是相对昂贵的操作,因此您不想将其包含在循环中。理想情况下,您可以使用 rm() 函数删除脚本中不再需要的对象,并让 R 决定何时执行垃圾回收。
还有一点需要注意:Rstudio 使用自己的设置启动 R。例如,这是常规 R 会话的输出:
gc(verbose=TRUE, full=TRUE)
#Garbage collection 2 = 0+0+2 (level 2) ...
#13.4 Mbytes of cons cells used (41%)
#3.7 Mbytes of vectors used (6%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 249316 13.4 608371 32.5 407443 21.8
#Vcells 484528 3.7 8388608 64.0 1607721 12.3
memory.limit()
#[1] 7888
memory.size()
#[1] 29.02
这是 Rstudio 中 R 会话的输出:
gc(verbose=TRUE, full=TRUE)
#Garbage collection 19 = 15+1+3 (level 2) ...
#32.6 Mbytes of cons cells used (45%)
#9.3 Mbytes of vectors used (14%)
# used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 610199 32.6 1369865 73.2 1369865 73.2
#Vcells 1210415 9.3 8388608 64.0 1842725 14.1
memory.limit()
#[1] 7888
memory.size()
#[1] 99.49