1

我有大量的 ECDF 对象。

如同:

vals <- rnorm(10000)
x <- ecdf(vals)
ecdfList <- lapply(1:10000, function(i) ecdf(vals))
save(ecdfList, file='mylist.rda')

class(ecdfList[[1]])
[1] "ecdf"     "stepfun"  "function"

让我们退出 R 服务器并重新开始。

q()
> R  (I'm on a server running ubuntu, R 3.4.4)

现在,问题是,当从一个新的环境开始时,加载和删除 ecdfList 不会释放内存。

load('mylist.rda')
rm(ecdfList)
gc()

top 和 free 仍然显示内存被 R 使用。

所以我想我会很聪明,把它们加载到一个新的环境中。

e = new.env()
load('mylist.rda', envir=e)
rm(e)
gc()

但是,同样的事情也会发生。top 和 free 仍然显示正在使用的内存。

那些 ecdf 对象在哪里?如何安全地从内存中删除该 ecdfs 列表?

也许记忆只是被保留..以防万一..被R?其他数据对象不会发生这种情况。

这是一个使用“免费”观看内存的示例。

在 Rstudio 中,我将创建一个向量列表,然后释放它们,检查之前和之后使用的内存。

dave@yoga:~$ free
                        total        used        free      shared
available Mem:       16166812     1548680    11725452      932416 

然后制作一个向量列表。

x <- lapply(1:10000, function(a) rnorm(n=10000))

然后检查空闲内存。

davidgibbs@gibbs-yoga:~$ free
                        total        used        free      shared 
available Mem:       16166812     2330068    10954372      921956 

在 Rstudio 中, rm 向量。

rm(x)
gc()

再次检查内存,

davidgibbs@gibbs-yoga:~$ free
                           total        used        free      shared
available    Mem:       16166812     1523252    11750620      932528     

好的,所以内存被退回了。

现在我们将尝试使用 ECDF 列表。

# already saved the list as above
e = new.env()
open('mylist.rda', envir=e)

并检查内存

dave@yoga:~$ free
              total        used        free      shared 
Mem:       16166812     1752808    10213168     1166136 


e <- new.env()
load('ecdflist.rda', envir = e)

我们会检查内存

dave@yoga:~$ free
              total        used        free      shared 
Mem:       16166812     3365536     8667616     1096236 

现在我们将 rm 那个环境。

rm(e)
gc()

最后的内存检查。

dave@yoga:~$ free
                        total        used        free      shared    
available Mem:       16166812     3321584     8726964 

在我们重置 R 之前仍然在使用。

谢谢!!-戴夫

4

0 回答 0