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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:30