您的问题是您的代码正在将所有内容转储到全局环境(您的 Rmd 环境)中。当我处理更大的数据时,我倾向于将我的分析包装到块内的一个函数中,而不是像编写 R 脚本一样编写它。我举一个简单的例子来说明:
将以下内容想象成一个脚本:
r <- load_big_data()
train <- r[...]
test <- r[...]
fit <- lm(x ~ y, data = train)
summary(fit)
如果这是您的块,当您的模型运行完成时,所有这些变量都会留在环境中。然而,如果你将你的工作封装在一个函数中,一旦函数完成,中间变量通常会从内存中释放出来。
r <- load_big_data()
myFun <- function(r) {
train <- r[...]
test <- r[...]
fit <- lm(x ~ y, data = train)
return(summary(fit))
}
现在,当 Rmd 被编织时,工作区中不再有 test、train 和 fit,而是在工作区中只有 r(和 myFun,这实际上是无成本的)
奖励:您会发现您可以重复使用这些函数,分析时间越长!
更新
RE:缓存 = TRUE
回答您的后续问题。 cache=TRUE 将从 RDS 文件加载,而不是重新运行代码块。它可以作为一种有效减少内存使用的工具——但您仍然需要记住从工作空间中删除数据,因为它是从缓存加载而不是运行。您应该将其视为节省时间,而不是节省内存,除非您手动清理。
回复:gc()
gc,或“垃圾收集”是 R 经常自行运行的进程的触发器,用于收集和转储它暂时持有但不再使用的内存。 R 中的垃圾回收非常好,但使用gc 可以帮助在更顽固的情况下释放内存。 Hadley 在这里做了很好的总结:http://adv-r.had.co.nz/memory.html。话虽如此,它很少是灵丹妙药,通常,如果您觉得需要使用它,您需要重新考虑您的方法或重新考虑您的硬件,或两者兼而有之。
re:外部资源
这听起来有点轻率,但有时加载另一台比您的机器大得多的机器来完成工作比修复内存泄漏要便宜得多(时间 == 美元)。示例:具有 16 个内核和 128GB RAM 的 R5 每小时 1 美元。你的时间计算通常是相当有利可图的。