#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
файлов, вы можете затем написать скрипт, который загружает каждую модель по очереди и делает с ней / извлекает то, что вы хотите.