首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R(未来)中进行多处理时,如何避免填满RAM?

在R(未来)中进行多处理时,如何避免填满RAM?
EN

Stack Overflow用户
提问于 2019-07-31 05:34:42
回答 2查看 763关注 0票数 1

我使用的是建立在future之上的furrr

我有一个非常简单的问题。我有一个文件列表,比如list('/mydata/file1.csv.gz', '/mydata/file1.csv.gz'),我正在用一个简单的函数并行处理这些文件,该函数加载数据,执行一些过滤操作,并将数据写入磁盘。

本质上,我的函数是

代码语言:javascript
复制
processing_func <- function(file){
  mydata <- readr::read_csv(file)
  mydata <- mydata %>% dplyr::filter(var == 1)
  data.table::fwrite(mydata, 'myfolder/processed.csv.gz')
  rm()
  gc()
}

所以我只是简单地运行

listfiles %>% furrr::future_map(., processing_func(.x))

这是可行的,但是尽管我调用了gc()rm(),内存却一直被填满,直到会话崩溃。

这里的概念问题是什么?为什么当我显式地丢弃一些剩余对象时,它们会以某种方式留在内存中?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-07-31 09:28:56

假设您在Windows上使用的是64位R,那么默认情况下,R只绑定到RAM。您可以使用memory.limit()来增加r会话可以使用的内存量。"memory.limit(50*1024)“一行将允许R会话使用50 of的内存。此外,R会在空间不足时自动调用gc(),因此该行对您没有帮助。

票数 1
EN

Stack Overflow用户

发布于 2021-05-16 15:31:37

您可以尝试使用callr未来计划,它可能会占用较少的内存。引用自future.callr vignette

当使用callr期货时,每个未来都会在一个新的后台R会话中解析,一旦收集到未来的值,该会话就会结束。相比之下,多会话期货是在后台R worker会话中解决的,这些会话在其生命周期中服务于多个期货。对每个未来使用新的R进程的好处是,可以保证R环境不会受到以前的未来的污染,例如内存分配、终结器、修改的选项以及加载和附加的包。缺点是启动新的R进程会增加额外的开销

代码语言:javascript
复制
library("future.callr")
plan(callr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57280339

复制
相关文章

相似问题

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