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

在R语言中保存单个大型对象,saveRDS与save哪个速度更快?

关于saveRDS与save的保存速度及优化建议

首先直接说结论:针对你单个大型数组的场景,save()和saveRDS()的底层序列化机制其实非常相似,两者的速度差异通常很小——甚至有时候save()因为要处理多对象的元数据,反而会略慢一点。不过最好的方式是自己跑个简单测试验证,比如用类似你数据结构的模拟数据对比耗时:

# 构造和你类似的测试数据:500个1000×20的矩阵组成的列表
big_data <- replicate(500, matrix(rnorm(1000*20), nrow=1000), simplify = FALSE)

# 测试saveRDS耗时
system.time(saveRDS(big_data, "test_rds.rds"))

# 测试save耗时(只存这一个对象)
system.time(save(big_data, file = "test_rda.rda"))

接下来重点说能显著提升保存速度的配置选项,这才是解决你问题的关键:

1. 调整压缩参数(最立竿见影)

不管是save()还是saveRDS(),默认的compress = TRUE会使用gzip压缩,压缩过程会消耗大量CPU时间。如果能接受更大的文件体积,直接设置compress = FALSE,保存速度会快好几倍:

# 无压缩的saveRDS,速度最快
system.time(saveRDS(big_data, "test_rds_uncompressed.rds", compress = FALSE))

# 无压缩的save同理
system.time(save(big_data, file = "test_rda_uncompressed.rda", compress = FALSE))

如果需要一定压缩比但不想牺牲太多速度,"bzip2"和"xz"的压缩比更高但速度更慢,所以追求速度的话,无压缩是最优解。

2. 使用最新的序列化版本

从R 3.5.0开始,支持version = 3的序列化格式,它对复杂对象的序列化效率更高,能减少序列化时间和文件体积。如果你不需要兼容老版本R,一定要加上这个参数:

saveRDS(big_data, "test_rds_v3.rds", version = 3, compress = FALSE)
save(big_data, file = "test_rda_v3.rda", version = 3, compress = FALSE)

3. 额外的优化思路

除了参数调整,还有几个方法能进一步提速:

  • 重构对象结构:你现在的结构是500个矩阵的列表,可以把它们合并成一个三维数组(比如dim = c(1000, 20, 500)),连续的内存块序列化起来更快:
    big_3d_array <- array(unlist(big_data), dim = c(1000, 20, 500))
    system.time(saveRDS(big_3d_array, "test_3d_array.rds"))
    
  • 优化存储介质:如果用的是机械硬盘,换成SSD会大幅降低IO耗时;避免在网络共享盘上保存,本地磁盘的IO速度快很多。
  • 尝试第三方序列化库:比如qs包,它的序列化速度比base R的函数快很多,同时文件体积也更小,适合大型对象:
    install.packages("qs")
    library(qs)
    system.time(qsave(big_data, "test_qs.qs"))
    
    唯一的缺点是需要依赖第三方包,但如果是自己使用的话,这个性价比非常高。

总的来说,save()和saveRDS()在单个对象场景下速度差异不大,核心优化点是关闭压缩+使用最新序列化版本,再配合对象结构或存储介质的调整,应该能大幅降低你的保存耗时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:15:46