如何快速合理地保存超大型R dataframe
解决R中超大型数据框快速保存的方案
嘿,我完全懂你这种等了好几个小时还没保存完的崩溃感!10G+、1亿行的数据框确实是个庞然大物,saveRDS在这种量级下确实力不从心。给你几个亲测有效的提速方案,你可以按需尝试:
1. 改用专为大数据优化的文件格式
这是最推荐的方案,速度提升非常明显:
fst包:专门针对R数据框做了高性能读写优化,是处理大数据的利器。安装后用以下代码保存,不压缩的情况下速度快到离谱,几分钟就能搞定千万级数据:
后续读取用# 先安装包 install.packages("fst") # 保存数据(compress=0为无压缩,速度最快;想省空间可设为1-100) fst::write_fst(dfname, "dfname.fst", compress = 0)fst::read_fst(),还支持按需加载指定列,非常灵活。data.table的fwrite:如果偏好CSV格式,data.table的fwrite比原生write.table快几十倍,虽然CSV占用空间更大,但写入速度依然碾压原生方法:# 若未安装data.table先安装 install.packages("data.table") # 保存为CSV data.table::fwrite(dfname, "dfname.csv")
2. 拆分数据框分块保存
如果不想更换文件格式,可以把大数据框拆分成多个小文件分别保存,单个小文件的写入时间会大幅缩短:
# 将数据框拆分为10个部分(可根据实际调整数量) split_df <- split(dfname, rep(1:10, each = ceiling(nrow(dfname)/10))) # 循环保存每个子数据框 for(i in seq_along(split_df)){ saveRDS(split_df[[i]], file = paste0("dfname_part_", i, ".rds"), compress = FALSE) }
后续读取时,可以用lapply加载所有子文件再合并:
parts <- lapply(1:10, function(x) readRDS(paste0("dfname_part_", x, ".rds"))) dfname <- do.call(rbind, parts)
3. 优化硬件与系统环境
- 确保保存目标磁盘是SSD:机械硬盘的写入速度远低于SSD,这是很多人忽略的关键瓶颈;
- 关闭后台占用磁盘IO的程序:比如正在运行的下载任务、杀毒软件扫描、云盘同步等,让R能独占更多磁盘资源。
4. 尝试save替代saveRDS(效果有限但可试)
虽然提升幅度不大,但部分场景下save处理大数据的速度会略快于saveRDS,用法如下:
save(dfname, file = "dfname.RData", compress = FALSE)
注意:后续读取需要用load(),会直接将数据框加载到当前环境中,无法像readRDS那样指定新的变量名。
内容的提问来源于stack exchange,提问作者HermitFF
相关产品推荐
相关产品推荐

