Как я могу восстановить память, используемую mgcv?

#r #memory #gam #mgcv

#r #память #gam #mgcv

Вопрос:

У меня возникла проблема, из-за которой у меня заканчивается память при выполнении большого количества игровых операций с использованием R-пакета mgcv. Я загружаю библиотеку и инициализирую некоторые случайные данные с помощью следующего скрипта.

 library(mgcv) #for gam
set.seed(1)
n = 1000
myData = data.frame(X1=rnorm(n),
                X2=rnorm(n),
                X3=rnorm(n),
                Y=rnorm(n))
gc()
  

Это дает

           used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1134579 60.6    1476915 78.9  1368491 73.1
Vcells 1611179 12.3    2518261 19.3  1961928 15.0
  

затем я устанавливаю десять игр и проверяю использование памяти с помощью

 fits <- lapply(1:10, function(j) {gam(Y~te(X1,X2,k=10) te(X2,X3,k=10), data=myData)})
gc()
object.size(fits)
  

результатом является

            used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells  1200064 64.1    1835812  98.1  1368491  73.1
Vcells 10192307 77.8   15351293 117.2 14537510 111.0
> object.size(fits)
22871928 bytes
  

Обратите внимание, что я создал только один объект (подходит), но объем используемой памяти в три раза превышает размер этого объекта. В конечном итоге R полностью исчерпывает память, поскольку я устанавливаю больше моделей. Что я делал, так это сохранял на диск

 saveRDS(fits, "fits", refhook=function(...) {"dummy"})
  

затем запускаю новый сеанс и перезагружаю

 library(mgcv) #for gam
fits <- readRDS("fits", refhook=function(...) {.GlobalEnv})
gc()
  

и вуаля! память восстановлена

           used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1139845 60.9    1835812 98.1  1368491 73.1
Vcells 4322985 33.0    4972379 38.0  4324092 33.0
  

Есть ли какой-либо способ повторно запросить память без необходимости сохранения на диск, запуска нового сеанса и последующей загрузки с диска?

Комментарии:

1. Является ли проблема, которая lapply() возникает из-за ошибки «не удается выделить больше памяти» перед возвратом? Вы пробовали запускать это как for цикл вместо этого? Когда я занимался подобными вещами с mgcv::gam() , я использовал for цикл, назначил i -ю модель объекту foo , чтобы она перезаписывалась на каждой итерации, записывал каждую модель на диск во время итерации и таким образом циклически перебирал модели объемом более 20 ГБ. Предполагая, что вы используете согласованное соглашение об именовании для .rds файлов, вы можете затем написать скрипт, который загружает каждую модель по очереди и делает с ней / извлекает то, что вы хотите.