Загадка памяти R в средах ECDF - PullRequest
1 голос
/ 15 марта 2019

У меня огромный список объектов 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)

Теперь проблема в том, что при запуске с новым env, загрузка и удаление ecdfList не освобождает память.

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

top и free по-прежнему показывают память, используемую R.

Так что я подумал, что буду умнее и загружу их в новую среду.

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

Но происходит то же самое. top и free по-прежнему показывают память как используемую.

Где эти экдф объекты? Как я могу безопасно удалить этот список ecdf из памяти?

Может быть, память просто удерживается ... на всякий случай ... R? Это не происходит с другими объектами данных.

Вот пример просмотра памяти с помощью «free».

Из 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(e)
gc()

Окончательная проверка памяти.

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

И все еще используется, пока мы не сбросим R.

Спасибо! -dave

...