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

