首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMarkdown、R笔记本和内存管理

RMarkdown、R笔记本和内存管理
EN

Stack Overflow用户
提问于 2022-01-04 21:02:55
回答 1查看 301关注 0票数 2

我正在做一个项目,其中涉及分析几个非常大的文本文件。我已经将项目分成了几个部分,每个项目都将在自己的RMarkdown/R笔记本中完成,但我遇到了实际的问题。

第一种情况是,当我正在处理一个部分(一个R文件)时,我必须定期地使用rm变量并使用gc()恢复内存。当我准备好编织文件时,我认为R将重新运行所有的东西--这意味着我需要用rm/gc步骤显式地以块编写。这是正确的吗?我知道您可以将选项cache = TRUE放在块选项中,但我以前还没有这样做过。如果我这样做了,所有这些结果是否都保存在内存中(即缓存中)?如果是的话,当我删除变量和恢复内存时会发生什么?这是保存结果以供演示而不必重新运行所有内容的正确方法吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-04 22:55:30

您的问题是,您的代码正在将所有内容转储到全局环境(您的Rmd环境)。当我处理更大的数据时,我倾向于将分析打包到块内的函数中,而不是像编写R脚本那样编写它。我将举一个简单的例子来说明:

将以下内容想象为脚本:

代码语言:javascript
复制
r <- load_big_data() 
train <- r[...]
test <- r[...]
fit <- lm(x ~ y, data = train)
summary(fit)

如果这是您的块,则在完成模型运行时,所有这些变量都留在环境中。但是,如果您将工作封装到一个函数中,则一旦函数完成,临时变量通常会从内存中释放出来。

代码语言:javascript
复制
r <- load_big_data()
myFun <- function(r) {
  train <- r[...]
  test <- r[...]
  fit <- lm(x ~ y, data = train)
  return(summary(fit))
}

现在,工作空间中不再有testtrainfit,因为Rmd是编织的,您的工作区中只有r (和myFun,这实际上是免费的)。

奖励:您会发现您可以重用这些功能,您的分析得到的时间越长!

更新

RE: cache = TRUE

回答你接下来的问题。cache=TRUE将从RDS文件中加载,而不是重新运行代码块。它可以有效地将内存使用量降到最低--但您仍然需要记住,在工作空间加载数据时,要从缓存中删除数据,而不是运行数据。您应该把这看作是节省时间,而不是节省内存,除非您手动清理。

关于: gc()

“垃圾收集”( gc )是一个进程的触发器,R自身经常运行这个进程来收集和转储它暂时持有但不再使用的内存。R中的垃圾收集非常好,但是使用gc可以帮助在更顽固的情况下释放内存。哈德利在这里做了一个很好的总结:http://adv-r.had.co.nz/memory.html。尽管如此,它很少是灵丹妙药,而且通常情况下,如果你觉得你需要使用它,你要么需要重新考虑你的方法,要么重新考虑你的硬件,或者两者兼而有之。

关于:外部资源

这听起来有点轻率,但有时加载另一台比您的机器大得多的机器来完成这项工作比修复内存泄漏要便宜得多(time == $)。一个有16个核心和128 R5内存的R5是每小时1美元。在你的时间微积分往往是相当有利可图的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70585029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档