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

Fedora下readr读取大CSV致RStudio崩溃,data.table正常的原因

问题:readr读取大CSV导致RStudio崩溃,而data.table::fread正常的原因

为遵循实验室标准,将笔记本电脑系统从Ubuntu 20.04全新安装为Fedora 37(16GB内存)后出现异常:使用readr读取6.7GB的CSV文件时会导致RStudio崩溃,而使用data.table::fread则可正常读取该文件。此前在Ubuntu系统中readr可正常处理该文件。

复现代码

library(archive)

url <- "https://www.usitc.gov/data/gravity/itpd_e/itpd_e_r02.zip"
zip <- gsub(".*/", "", url)

if (!file.exists(zip)) {
  try(download.file(url, zip, method = "wget", quiet = T))
}

if (!length(list.files(getwd(), pattern = "ITPD_E_R02\\.csv")) == 1) {
  archive_extract(zip, dir = getwd())
}

# 执行此代码会导致RStudio崩溃
# trade <- readr::read_csv("/ITPD_E_R02.csv")

# 此代码可正常运行
trade <- data.table::fread("/ITPD_E_R02.csv")

系统内存信息

$ free -m
               total        used        free      shared  buff/cache   available
Mem:           15699        4332        1106        1032       10259        9957
Swap:           8191           9        8182

R会话信息

sessionInfo()
R version 4.2.2 (2022-10-31)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Fedora Linux 37 (Workstation Edition)

Matrix products: default
BLAS/LAPACK: /usr/lib64/libflexiblas.so.3.3

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8       
 [4] LC_COLLATE=en_CA.UTF-8     LC_MONETARY=en_CA.UTF-8    LC_MESSAGES=en_CA.UTF-8   
 [7] LC_PAPER=en_CA.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C        

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base      

other attached packages:
[1] data.table_1.14.8 readr_2.1.4       archive_1.1.5    

loaded via a namespace (and not attached):
 [1] fansi_1.0.4       tzdb_0.3.0        utf8_1.2.3        R6_2.5.1          lifecycle_1.0.3  
 [6] magrittr_2.0.3    pillar_1.8.1      rlang_1.0.6       cli_3.6.0         rstudioapi_0.14  
[11] ellipsis_0.3.2    vctrs_0.5.2       tools_4.2.2       glue_1.6.2        hms_1.1.2        
[16] compiler_4.2.2    pkgconfig_2.0.3   CoprManager_0.5.0 tibble_3.1.8

原因分析

  • 内存管理策略差异:readr默认会一次性加载整个文件到内存,且自动类型推断、数据转换过程会占用额外临时内存;而fread采用分块读取、延迟加载等高效策略,对内存占用的控制更严格。Fedora的内存调度机制(如OOM killer阈值、页面回收逻辑)和Ubuntu存在差异,当readr的内存占用触发系统回收机制时,RStudio进程会被强制终止。
  • 依赖库编译与兼容性问题:readr依赖的底层解析库(如libiconv、libcurl)在Fedora和Ubuntu上的编译参数、版本不同。Fedora 37使用的库版本可能存在未适配的bug,导致解析大文件时出现内存泄漏或崩溃。
  • RStudio与系统环境交互限制:Fedora 37的桌面环境(如GNOME)或SELinux安全策略,可能对RStudio的内存访问有更严格的限制。readr的内存申请模式刚好触发了这些限制,而fread的内存使用模式避开了该问题。
  • BLAS/LAPACK库冲突:当前使用的libflexiblas.so.3.3和Ubuntu上可能使用的OpenBLAS/MKL在内存管理逻辑上存在差异,和readr的解析流程产生冲突,引发内存溢出。

验证与解决建议

  • 直接在终端运行R(而非RStudio)测试readr读取文件,若终端中正常,说明是RStudio与Fedora桌面环境的交互问题,可尝试更新RStudio到最新版本,或调整RStudio的内存限制。
  • 更新readr到最新版本:执行install.packages("readr"),新版本可能修复了Fedora环境下的兼容性bug。
  • 调整readr读取参数:手动指定col_types列类型,避免自动推断占用额外内存;或使用read_csv_chunked分块读取文件,降低单次内存负载。
  • 检查系统OOM日志:查看/var/log/messages或dmesg输出,确认是否是系统OOM killer终止了RStudio进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:07:17