本文介绍了在R(未来)中进行多处理时如何避免填满RAM?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用的是建立在future之上的furrr。
我有一个非常简单的问题。我有一个文件列表,比如说list('/mydata/file1.csv.gz', '/mydata/file1.csv.gz'),我正在与一个简单的函数并行处理它们,该函数加载数据,执行一些筛选操作,并将其写入磁盘。
本质上,我的函数是
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(),RAM仍会一直填满,直到会话崩溃。
这里的概念问题是什么?为什么当我显式丢弃某些剩余对象时,它们会以某种方式保留在内存中?
谢谢!
推荐答案您可以尝试使用callr未来计划,它可能会占用较少的内存。 引用自future.callr小节
当使用Callr期货时,每个未来都在一个新的后台R会话中解析,该会话在收集到未来的值后立即结束。相比之下,多会话期货是在后台R Worker会话中解决的,这些会话在其生命周期内服务于多个期货。对每个未来使用新的R进程的好处是,可以保证R环境不会受到以前的未来的污染,例如内存分配、终结器、修改的选项以及加载和附加的包。缺点是启动新的R进程会增加开销
library("future.callr") plan(callr)更多推荐
在R(未来)中进行多处理时如何避免填满RAM?
发布评论