R语言中RDS文件是否比CSV文件读写存储效率更高?
R语言RDS与CSV格式效率对比问题
观察到的现象
- 相近文件体积的RDS文件导入R的速度远快于CSV文件
- 将本地存储的CSV文件导入R后,调用
saveRDS保存为RDS格式,再调用readRDS重新导入RDS版本的同一份数据,导入耗时明显低于导入原CSV版本的耗时
验证实验过程
步骤1:构造测试数据集
# 构造测试用数据框,模拟实际分析中的整数型结构化数据集 test_file = data.frame( col1 = sample.int(100, 1000000, replace = TRUE), col2 = sample.int(100, 1000000, replace = TRUE), col3 = sample.int(100, 1000000, replace = TRUE), col4 = sample.int(100, 1000000, replace = TRUE), col5 = sample.int(100, 1000000, replace = TRUE), col6 = sample.int(100, 1000000, replace = TRUE), col7 = sample.int(100, 1000000, replace = TRUE), col8 = sample.int(100, 1000000, replace = TRUE), col9 = sample.int(100, 1000000, replace = TRUE), col10 = sample.int(100, 1000000, replace = TRUE), col11 = sample.int(100, 1000000, replace = TRUE), col12 = sample.int(100, 1000000, replace = TRUE), col13 = sample.int(100, 1000000, replace = TRUE), col14 = sample.int(100, 1000000, replace = TRUE), col15 = sample.int(100, 1000000, replace = TRUE), col16 = sample.int(100, 1000000, replace = TRUE), col17 = sample.int(100, 1000000, replace = TRUE), col18 = sample.int(100, 1000000, replace = TRUE), col19 = sample.int(100, 1000000, replace = TRUE), col20 = sample.int(100, 1000000, replace = TRUE) )
步骤2:对比两种格式的导出耗时
# 测试CSV导出耗时 start.time <- Sys.time() write.csv(test_file, "test_file.csv") end.time <- Sys.time() end.time - start.time # Time difference of 28.84087 secs # 测试RDS导出耗时 start.time <- Sys.time() saveRDS(test_file, "test_file.RDS") end.time <- Sys.time() end.time - start.time # Time difference of 11.96845 secs
测试结果:RDS导出速度明显快于CSV。
步骤3:对比两种格式的文件体积
# 查看文件大小(单位:字节) file.info("test_file.csv")$size # [1] 68287349 file.info("test_file.RDS")$size # [1] 26169028 68287349/26169028 # [1] 2.609472
测试结果:CSV体积约为RDS的2.6倍,RDS存储空间占用更小。
步骤4:对比两种格式的导入耗时
# 测试CSV导入耗时 start.time <- Sys.time() test = read.csv("test_file.csv") end.time <- Sys.time() end.time - start.time # Time difference of 8.349364 secs # 测试RDS导入耗时 start.time <- Sys.time() test = readRDS("test_file.RDS") end.time <- Sys.time() end.time - start.time # Time difference of 0.59674 secs
测试结果:RDS导入速度明显快于CSV。
问题答复
关于RDS效率优势的事实依据、实验有效性说明
- RDS在R环境下的读写效率、存储效率高于CSV是有明确底层逻辑支撑的普遍结论,不是单次实验的偶然结果:
- CSV是通用纯文本格式,读写过程存在大量额外开销:导出时需要把R内存中不同类型的对象(整数、数值、因子、日期等)全部转换为纯文本字符串再写入磁盘;导入时需要逐行逐列识别分隔符、自动推断每列的数据类型、再把文本转换回R可识别的内存对象,这部分解析操作的计算量非常大。
- RDS是R原生的二进制序列化格式,读写时直接将内存中的R对象按二进制结构落盘/加载,不需要做文本解析、类型推断,默认还自带轻量压缩,天然比CSV少了绝大多数计算步骤,速度更快、体积更小是必然结果。你测试中得到的RDS导入速度约为CSV14倍的结果,和社区大量公开测试的数值型数据集表现一致,不存在偏差。
- 更换数据集不会改变核心结论,仅会影响效率差距的幅度:
- 如果数据集包含大量长文本字符串,RDS的体积优势会有所缩小,但读写速度依然显著高于CSV;如果数据集以数值、因子、日期等结构化数据为主,RDS的速度、体积优势会比本次测试结果更明显。
- 本次实验整体逻辑成立,仅存在三处不影响核心结论的小瑕疵:
- 没有做多次重复测试取平均耗时,单次计时容易受系统后台其他进程的资源占用干扰,结果会存在小幅波动;
- 测试数据集仅覆盖了整数类型,没有包含字符串、因子、日期、缺失值等常见数据类型,无法体现不同数据类型下的效率差距幅度;
- 调用
write.csv时没有加row.names = FALSE参数,默认把R的行索引作为第一列写入了CSV,会让CSV文件体积虚增一小部分,即便修正这个参数,RDS的优势依然非常显著。
大规模建模场景下使用RDS的性价比说明
在全R生态的机器学习、统计建模工作流中,将清洗完成的数据集提前转换为RDS格式的性价比非常高,是工业界很常用的优化手段:
- 能大幅缩短数据加载等待时间:GB级别的CSV文件读取往往需要数分钟到十几分钟,同等数据的RDS文件通常几十秒即可加载完成,每次运行脚本都能节省大量无意义的等待时间;
- 能减少重复预处理开销、降低出错概率:RDS会完整保留R对象的所有属性,包括提前设置好的列类型、因子水平顺序、日期格式、自定义字段属性等,不需要每次读取CSV后重复做类型转换、因子重编码、时间格式解析等预处理操作,也能避免
read.csv自动类型推断导致的常见错误(比如把带前导零的编码读成数值丢失前导零、把ID字段误识别为数值等); - 唯一需要注意的适用边界:RDS是R专属格式,无法被Python、SAS等其他数据分析工具直接读取,如果需要跨工具协作,要额外保留一份通用格式的源文件;如果是R环境内部的分析、建模流程,中间结果和清洗完成的最终分析数据集使用RDS存储是最优选择。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

