我遇到了一个问题,即在使用 R 包 mgcv 运行大量 GAM 时内存不足。我加载库并使用以下脚本初始化一些随机数据。
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
接下来我适合十个 GAM 并检查内存使用情况
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
有什么方法可以在不需要保存到磁盘、启动新会话然后从磁盘加载的情况下重新声明内存?