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

