You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:17:44