7

在最新版本的 R (3.5.0) 中,为垃圾收集(完整)添加了一个新参数。

gc(verbose = getOption("verbose"), reset = FALSE, full = TRUE)

无论做了什么,它似乎都解决了我的记忆问题。我的问题是虽然我不理解为“专家”编写的文档,但对于像我这样的凡人来说,很难理解它的含义。

谁能更详细地解释以下参数描述的实际含义,以及为每个参数选择 True/False 对我有什么影响?

重置逻辑;如果为 TRUE,则使用的最大空间值将重置为当前值。

完全合乎逻辑;如果为 TRUE,则执行完整的收集;否则只能收集最近分配的对象。

完整文档位于:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/gc.html

提前致谢。

4

1 回答 1

13

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
于 2018-05-21T18:49:35.263 回答