在R(未来)中进行多处理时如何避免填满RAM? [英] how to avoid filling the RAM when doing multiprocessing in R (future)?

查看:13
本文介绍了在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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆