在将 furrr 函数应用于大量 tibbles 时优化内存使用:遇到意外的内存增加

问题描述 投票:0回答:0

我目前正在进行一项任务,该任务涉及将函数应用于相当广泛的 tibbles 列表,其中包含大约 30,000 个元素。我使用的代码如下:

plan(multisession, workers=20)

hpar$input_df %>%
    group_by(key) %>% 
    group_split() %>%
    future_walk(sf_do_all_one_series, 
                hpar$df_stockout_decaying, 
                hpar$out_path, 
                hpar$out_prefix, 
                .env_globals = empty_env())

在 future_walk 函数中调用的函数

sf_do_all_one_series
具有以下结构:

sf_do_all_one_series <- function(df_1, df_stockout_decaying, out_path, out_prefix){
  
  key <- df_1 %>% distinct(key) %>% pull()
  
  do_stuff(df_1, df_stockout_decaying) %>% 
    do_more_stuff() %>% 
    write.table(file=paste0(out_path, out_prefix, "_", key, ".csv"), quote=FALSE, sep='\t', row.names=FALSE)
  
  invisible()
}

hpar$input_df
tibble 由大约 300 万条记录组成,其大小(使用
object.size(.)
计算)约为 202 MB。另一方面,
hpar$df_stockout_decaying
是一个包含常量值的小标题。最后,
hpar$out_path
hpar$out_prefix
是字符串。

我遇到的问题是,在此过程中内存使用量随时间急剧增加,就好像正在保存一些中间输出。我正在寻求有关了解内存增加的潜在原因和任何可能的解决方案的指导。

我已经多次尝试解决内存问题,但到目前为止还没有成功。以下是我采取的步骤:

  1. 移除中间对象:我尝试在代码中尽量减少中间对象的使用,以减少内存消耗。

  2. 垃圾收集器:我还使用

    gc()
    函数显式调用垃圾收集器来释放任何未使用的内存。

  3. .env_globals = empty_env()
    :虽然我不认为
    .env_globals = empty_env()
    参数对于 future_walk 是必需的,但我仍然尝试包含它,希望它可能会产生影响。

不幸的是,尽管实施了这些措施,内存使用率并没有显示出任何明显的改善。

我将不胜感激任何有助于解决此问题的建议或见解。

r future furrr
© www.soinside.com 2019 - 2024. All rights reserved.