如何在future包multisession框架中获取Worker名称?
解决future multisession中Worker独立写入文件的问题
核心需求
使用future包的multisession计划并行处理大规模数据分析时,避免将所有模型结果返回主会话导致内存溢出,让每个Worker单独将结果写入硬盘,同时通过Worker唯一标识避免文件写入冲突。
可行方案
1. 获取Worker的唯一标识
在future的并行环境中,每个Worker都是独立进程,可通过两种方式获取唯一标识:
- 进程ID(PID):调用
Sys.getpid(),每个Worker进程的PID全局唯一,兼容性强 - Worker编号:调用
future::workerId()(需确保future版本≥1.20.0)
2. 修改代码实现Worker独立写入
调整原有future_map逻辑,让每个任务在Worker上完成模型拟合后,直接将结果写入带唯一标识的文件,最后统一合并所有分散文件。
修改后的代码示例
library(future) library(furrr) library(tidyverse) library(nnet) library(broom) plan(multisession, workers = 4) # 提前创建结果存储目录 dir.create("worker_results", showWarnings = FALSE) str_subset(colnames(m_demm), "^cg") %>% set_names() %>% future_map(function(cg_id) { # 获取当前Worker的PID作为唯一标识 worker_pid <- Sys.getpid() # 构建模型并整理结果 model_result <- str_c("dementia_ages1_eos ~ ", cg_id, " + a1age + sex") %>% as.formula() %>% multinom(data = m_demm) %>% broom:::tidy.multinom() %>% modify_at("term", ~ str_remove_all(.x, "dementia_ages1_eos|\\)|\\(")) %>% mutate(cg = cg_id) # 保留CpG位点标识 # 生成唯一文件名:结合Worker PID和CpG名称,避免冲突 output_file <- str_glue("worker_results/result_{worker_pid}_{cg_id}.csv") # 直接写入硬盘 write_csv(model_result, output_file) }) # 所有并行任务完成后,合并所有结果文件 combined_results <- list.files("worker_results", pattern = "*.csv", full.names = TRUE) %>% map_dfr(read_csv) # 可选:清理临时结果文件 # unlink("worker_results", recursive = TRUE)
关键说明
- 文件名同时包含Worker PID和CpG名称,双重保证唯一性,既避免同一Worker内的任务冲突,也防止不同Worker的文件互相覆盖
- 无需将大量结果返回主会话,大幅降低内存占用
- 若使用
future::workerId()替代Sys.getpid(),只需替换标识获取代码,文件名格式同步调整即可
内容的提问来源于stack exchange,提问作者David Li
相关产品推荐
相关产品推荐

