如何在R中高效加载含5500万行的超大TXT文件?
我之前处理过好几份千万级行的文本文件,你遇到的这种分段读取到后半段卡顿的情况,大概率是read.table本身效率偏低,再加上文件末尾可能存在格式异常的行。给你几个更实用的解决方案:
1. 用data.table的fread直接搞定(首选)
fread是专门为大文件优化的读取函数,速度比read.table快几十倍,内存占用也低很多,很多时候不用手动分段就能直接导入整个文件:
library(data.table) # 直接导入全量数据,自动处理分隔符、空值等 us_citations <- fread( "201709_US_Citations_3.txt", sep = "|", header = TRUE, na.strings = "NA", stringsAsFactors = FALSE # 这个参数一定要关,不然内存爆炸还慢 )
如果你的内存实在不够撑全量数据,也可以用fread分块读取,比手动写read.table分段要靠谱得多:
library(data.table) # 先获取列名和总行数 col_names <- fread("201709_US_Citations_3.txt", sep = "|", nrows = 0) total_rows <- as.integer(system(paste("wc -l", "201709_US_Citations_3.txt"), intern = TRUE)) - 1 # 减1是去掉表头行 chunk_size <- 5000000 us_citations_list <- list() # 循环读取每一块 for (i in seq(0, total_rows - chunk_size, by = chunk_size)) { chunk <- fread( "201709_US_Citations_3.txt", sep = "|", skip = i + 1, # 跳过前面已经读的行(表头算第1行) nrows = chunk_size, col.names = names(col_names), na.strings = "NA", stringsAsFactors = FALSE ) us_citations_list[[length(us_citations_list) + 1]] <- chunk } # 处理最后剩余的行 remaining_rows <- total_rows %% chunk_size if (remaining_rows > 0) { last_chunk <- fread( "201709_US_Citations_3.txt", sep = "|", skip = total_rows - remaining_rows + 1, nrows = remaining_rows, col.names = names(col_names), na.strings = "NA", stringsAsFactors = FALSE ) us_citations_list[[length(us_citations_list) + 1]] <- last_chunk } # 合并所有块(rbindlist比rbind快很多) us_citations <- rbindlist(us_citations_list)
2. 用readr包的read_delim(tidyverse用户友好)
如果你习惯用tidyverse系列工具,readr的read_delim效率也远高于read.table,还支持分块处理:
library(readr) # 直接导入全量 us_citations <- read_delim( "201709_US_Citations_3.txt", delim = "|", col_names = TRUE, na = "NA", show_col_types = FALSE # 关闭列类型提示,加快速度 ) # 分块读取(适合需要边读边处理的场景) process_chunk <- function(chunk, pos) { # 这里可以加中间处理逻辑,比如过滤无效行、转换数据类型 return(chunk) } us_citations <- read_delim_chunked( "201709_US_Citations_3.txt", delim = "|", callback = DataFrameCallback$new(process_chunk), col_names = TRUE, na = "NA" )
3. 检查文件末尾是否有损坏行
你说最后1000万行哪怕读10行都卡顿,很可能是文件末尾存在大量空行、特殊字符或者格式错乱的行。可以用命令行工具先排查:
- Linux/macOS:在终端执行
tail -100 201709_US_Citations_3.txt查看最后100行内容 - Windows PowerShell:执行
Get-Content 201709_US_Citations_3.txt | Select-Object -Last 100
如果发现异常行,可以用文本编辑器清理,或者在读取时用fill=TRUE参数让函数自动填充缺失的列,跳过格式错误。
4. 调整R的内存限制
如果是内存不足导致的卡顿,可以尝试增加R的可用内存:
# Windows系统,设置为16G(根据你的电脑内存调整) memory.limit(size = 16384) # Linux/macOS系统,设置为16G options(mem.maxVSize = 16 * 1024^3)
内容的提问来源于stack exchange,提问作者WoeIs
相关产品推荐
相关产品推荐

