`ecdf`在哪里保存它的对象?(以及如何测量它?)

Tal*_*ili 6 memory-leaks r

我似乎无法理解R保存数据的位置ecdf.以下是一些代码来说明这一点:

> set.seed(2016-10-30)
> x <- rnorm(1e4)
> y <- ecdf(x)
> object.size(x)
80040 bytes
> object.size(y)
3896 bytes
> rm(x)
> gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  602079 32.2    1168576   62.5    750400   40.1
Vcells 1183188  9.1  299644732 2286.2 750532746 5726.2
> object.size(y)
3896 bytes
> plot(y) # still works...
> 
Run Code Online (Sandbox Code Playgroud)

如果y的大小很小,则意味着数据被保存在某处.它显然没有保存在x中(因为我删除了它).

  1. 它可能在某些环境中,但我们如何访问它?那么这些数据保存在哪里,以及如何访问它?
  2. 这会如何影响memory.limit()?(即:运行R进程的缓存或内存限制)

tch*_*rty 5

函数闭包,@ hadley的Advanced R中的封闭,执行和调用环境都有很棒的解释.

对于您的具体示例,如注释中所述,对象的大小及其封闭环境要大得多:

pryr::compare_size(y)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法查看此对象所包含的对象及其相对大小:

sapply(codetools::findGlobals(y), function(x) object.size(get(x, environment(y))))
Run Code Online (Sandbox Code Playgroud)

您可以对最后一个向量求和,以确定这确实pryr::object_size是报告的内容(在我的机器上为164 kB).