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

使用arrow::read_delim_arrow读取21GB大文件致R会话崩溃(16GB内存)

解决R中arrow包读取大分隔符文件时会话崩溃的问题

问题情况

  • 系统内存16GB,需处理21GB以“|”为分隔符的数据集
  • 调用arrow::read_delim_arrow()时R会话直接中止(触发致命错误)
  • 尝试arrow::read_csv_arrow()因分隔符不匹配报错
  • Python Polars可正常读取该文件
  • 崩溃代码:
library(arrow)
library(duckdb)
library(tidyverse)
library(lubridate)

SF_21gb_arrow = arrow::read_delim_arrow('../Single-Family Loan Performance Data/HARP_Files/HARPLPPub.csv',
                                           as_data_frame = FALSE, delim = "|")

可行解决方案

1. 限制arrow单次读取的块大小

read_delim_arrow默认可能一次性加载过多数据,通过block_size参数设置单次读取的内存上限,强制分块处理,避免内存溢出:

library(arrow)

# 设置块大小为512MB,可根据内存余量调整(比如256MB或1GB)
SF_21gb_arrow <- read_delim_arrow(
  '../Single-Family Loan Performance Data/HARP_Files/HARPLPPub.csv',
  delim = "|",
  as_data_frame = FALSE,
  block_size = 512 * 1024 * 1024
)

2. 用DuckDB做内存外处理

既然已经加载了duckdb包,直接用它读取文件并通过SQL处理,无需全量加载到内存:

library(duckdb)
library(DBI)

# 建立DuckDB连接(内存模式,数据不落地)
con <- dbConnect(duckdb(), dbdir = ":memory:")

# 直接从文件导入数据到DuckDB表,自动处理大文件
dbExecute(con, "
  CREATE TABLE harp_data AS
  SELECT * FROM read_csv_auto('../Single-Family Loan Performance Data/HARP_Files/HARPLPPub.csv', sep = '|')
")

# 按需查询数据,比如取前10行
dbGetQuery(con, "SELECT * FROM harp_data LIMIT 10")

# 用完关闭连接
dbDisconnect(con, shutdown = TRUE)

3. 用arrow的数据集模式延迟加载

通过open_dataset创建数据集对象,不立即加载全量数据,后续按需查询:

library(arrow)

# 创建CSV数据集,指定分隔符
ds <- open_dataset(
  '../Single-Family Loan Performance Data/HARP_Files/',
  format = "csv",
  delim = "|"
)

# 查看数据集结构
ds

# 按需筛选并加载部分数据,比如取1000行
ds %>% filter(loan_id == "xxx") %>% collect(n = 1000)

4. 更新arrow到最新版本

旧版arrow可能存在大文件读取的bug,先检查版本并更新:

# 查看当前版本
packageVersion("arrow")

# 更新到最新版
install.packages("arrow")

内容的提问来源于stack exchange,提问作者ViSa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:52:39