R语言按ID映射Family批量合并大体积txt文件的实现方案问询
R大体积多TXT文件按家族合并优化方案
核心优化逻辑
原有代码将所有文件内容全量加载到内存,文件数量多、体积大时会出现内存溢出问题。优化后取消全量加载逻辑,采用「单文件读取-匹配家族-直接追加到目标文件」的流式处理逻辑,无需依赖临时目录,内存占用仅和单文件最大体积挂钩,可支持TB级总文件量处理。
优化后代码
library(fs) library(stringr) library(dplyr) # 1. 预处理Name-Family映射表,如单个Name对应多个Family可去掉distinct逻辑,转为列表存储 dfNameFamily <- tibble( Name = as.character(df$Name), Family = as.character(df$Family) ) %>% distinct(Name, .keep_all = TRUE) # 转为命名向量实现O(1)速度匹配家族 name2family <- setNames(dfNameFamily$Family, dfNameFamily$Name) # 2. 路径配置,单独输出目录避免和源文件混淆 input_dir <- "~/textfiles" output_dir <- "~/merged_family_files" dir_create(output_dir, recurse = TRUE) # 3. 遍历所有txt文件逐份处理 txt_files <- dir_ls(input_dir, regexp = "\\.txt$") for (file_path in txt_files) { # 跳过空文件 if (file_size(file_path) == 0) next # 仅读取第一行提取Name,无需加载整个文件内容 first_line <- readLines(file_path, n = 1) name <- str_match(first_line, "id=(.*?);")[,2] # 跳过id匹配失败、不在映射表内的文件 if (is.na(name) || !name %in% names(name2family)) next # 匹配对应家族,生成输出文件路径 family <- name2family[name] output_file <- file.path(output_dir, paste0(family, ".txt")) # 直接将源文件内容追加到家族文件,无需在内存中合并 con_in <- file(file_path, open = "r") con_out <- file(output_file, open = "a") writeLines(readLines(con_in), con_out) close(con_in) close(con_out) }
额外说明
如果你的查找表存在一个Name对应多个Family的情况,只需要将name2family处理为键为Name、值为对应Family列表的结构,匹配到Name后循环写入所有对应Family的文件即可。
内容的提问来源于stack exchange,提问作者Myke
相关产品推荐
相关产品推荐

