使用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
相关产品推荐
相关产品推荐

