在 R 中加载模型需要比用于构建模型更多的内存

问题描述 投票:0回答:1

我在一个独特的 R 会话中用脚本构建了 18 个模型。 由于每个模型都是经过相当长的时间的步骤选择过程的结果,因此我使用脚本末尾的函数

.Rdata
将 18 个最终模型保存为
save
文件。

现在,几天后,我想加载这些模型并继续处理它们。 因此,我想在全新的 R 会话中

load
它们,但是,在我加载所有模型之前,我收到如下消息:

无法分配 XXMb 的向量

考虑到当我首先创建这些模型时,它们都同时存在于内存中,直到我保存它们(显然加上当时 R 会话中的其他对象),为什么现在我无法加载它们都在同一个空的 R 会话中?

每个模型的大小在 680,000 到 710,000 KB 之间,总共 11Gb(包括所有模型)。

补充资料:

  • 我正在取消 R 版本 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting"
    平台:x86_64-w64-mingw32/x64(64 位)
  • 在此期间我没有装满我的硬盘(在电脑启动时仍然有 50gb 的空闲空间)
  • 我有 15 Gb 内存
  • 运行 windows 10
  • models 来自
    mppm
    object from the package
    spatstat
    基于 glm, glmm, or gam.

知道为什么会发生这种情况以及如何解决这个问题吗?

谢谢

r memory save load spatstat
1个回答
0
投票

简答: 拟合模型包含对其他数据的交叉引用,这些数据不能轻易保存到文件和从文件中恢复。

长答案:任何类型的合身模型(包括标准

lm
glm
以及
spatstat
包模型
ppm
kppm
)包含对一个或多个
environment
的引用实际上包含用于拟合模型的数据。

本质上,

environment
是对存在于 R 会话中某处并由 R 系统本身管理的列表(数据对象的命名列表)的指针或引用。

如果

m
是您刚刚拟合的模型,那么
environment(terms(m))
environment(formula(m))
可能包含这样的数据(尝试像
ls(envir=environment(terms(m)))
这样的东西来查看它们包含什么)。

这是一个节省存储空间的重要机制,因为模型对象

m
只需要包含指向环境的引用或指针,而不是它的内容。同样
object.size(m)
不包括这些引用环境的contents的内存大小,只包括引用指针的大小

我不知道将拟合模型保存在文件中时会发生什么,但我们(

spatstat
作者)不推荐这样做,因为这些交叉引用要么丢失,要么整个环境必须删除-引用并保存在文件中。听起来后者可能会发生在您的情况下,然后系统会阻止尝试立即重新加载所有这些数据。

© www.soinside.com 2019 - 2024. All rights reserved.