批量处理8000个TXT文件生成词数DataFrame速度过慢,求优化
处理大量TXT文件的速度优化方案
原代码的低效问题分析
- 内层
for(i in 1:length(files))完全冗余:处理单个文件时重复赋值多达8000次,纯浪费计算资源 - 字符串清理逻辑繁琐:多次调用
str_replace_all处理空格,效率低下 - 逐个读取文件:未利用批量读取的优势,循环开销大
- 数据框初始化方式不够高效:循环修改数据框的操作本身就很慢
优化方案及代码实现
1. 基础优化版(单线程,大幅提升速度)
通过批量读取、简化字符串处理、移除冗余循环实现核心优化:
library(dplyr) library(stringr) library(readtext) # 定义文件路径,避免重复书写 txt_path <- 'E:/txt/GEM_TXT_2022' # 获取所有TXT文件的完整路径 files <- list.files(path = txt_path, pattern = "\\.txt", full.names = TRUE) # 批量读取所有文件,直接返回包含文件名和文本的data.frame txt_data <- readtext(files) # 批量清理文本并计算词数 txt_data <- txt_data %>% mutate( # 一步完成文本清理:移除数字、标点,压缩所有连续空白为单个空格,去除首尾空格 cleaned_text = str_remove_all(text, "[:digit:]|[:punct:]") %>% str_squish(), # 按非空白字符序列计数(即词数) word_count = str_count(cleaned_text, "\\S+") ) # 整理成最终结果 word_count_result <- txt_data %>% select(doc_id, word_count) %>% tibble::column_to_rownames("doc_id") head(word_count_result)
2. 并行处理版(针对超大量文件,利用多核CPU)
如果文件数量极多,可通过并行处理进一步提速:
library(dplyr) library(stringr) library(readtext) library(furrr) # 初始化并行会话,使用所有可用CPU核心 plan(multisession) txt_path <- 'E:/txt/GEM_TXT_2022' files <- list.files(path = txt_path, pattern = "\\.txt", full.names = TRUE) # 并行处理每个文件 word_count_list <- future_map(files, function(file) { txt <- readtext(file)$text # 清理文本 cleaned <- str_remove_all(txt, "[:digit:]|[:punct:]") %>% str_squish() # 计算词数 count <- str_count(cleaned, "\\S+") # 返回文件名和对应词数 tibble(doc_id = basename(file), word_count = count) }) # 合并所有并行结果 word_count_result <- bind_rows(word_count_list) %>% tibble::column_to_rownames("doc_id") head(word_count_result) # 关闭并行会话 plan(sequential)
额外提速小技巧
- 避免使用
setwd(),直接用full.names = TRUE获取完整文件路径,减少路径相关错误 - 若文件编码不一致,在
readtext中指定encoding参数(如encoding = "UTF-8"),避免读取异常 - 若仅需词数,可尝试用base R的
readLines或readChar读取文件,跳过readtext的额外解析开销
内容的提问来源于stack exchange,提问作者Terence Tien
相关产品推荐
相关产品推荐

