targets框架下超内存对象分支的最优策略咨询
解决targets并行处理气象站数据时的内存过载问题
问题根源
你当前的corrected_data目标使用pattern = ids分支,这会导致每个分支在处理时试图加载全部station_data对象(所有气象站的数据分支),再通过筛选匹配单个站点ID。每个工作进程都会加载全量数据副本,直接触发内存耗尽。
解决方案
核心思路是让corrected_data直接基于station_data的分支进行处理,而非基于ids。这样每个corrected_data分支只会获取对应单个气象站的数据,无需加载全量数据集。同时结合data.table优化数据操作效率:
- 将
station_data输出改为data.table格式并保留站点ID; - 使用
pattern = map(station_data)让corrected_data分支与station_data分支一一对应; - 在
corrected_data中直接对单个站点的data.table执行分析操作。
修正后的代码
library(targets) library(data.table) tar_script({ tar_option_set( controller = crew::crew_controller_local(workers = 2), memory = "transient", garbage_collection = TRUE, storage = "worker" ) library(crew) tar_pipeline( tar_target(ids, 1:100), # 输出单站点的data.table,包含ID和对应数据 tar_target(station_data, data.table(id = ids, val = runif(10000)), # 模拟单站点10k条记录 pattern = map(ids)), # 直接映射station_data分支,每个分支仅处理单个站点的数据 tar_target(corrected_data, sort(station_data$val), pattern = map(station_data)) ) }, ask = FALSE) tar_make()
额外说明
- 若分析需要站点ID,可直接从
station_data$id获取,无需额外依赖ids目标; - 该方案完全适配
data.table操作逻辑,无需依赖dplyr::group_by或tar_group; - 保留
memory = "transient"和garbage_collection = TRUE配置,进一步优化内存回收效率。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

