R调用readRDS报错bad restore file magic number问题咨询
报错触发原因
- 函数调用不匹配:报错日志显示实际调用了
load()函数读取RDS文件,load()是专门用于读取.RData/.Rda格式多对象存储文件的函数,saveRDS()生成的单对象RDS文件只能用readRDS()读取,两者序列化格式的魔术校验码不匹配,直接触发magic number错误。 - 存储版本不兼容:R 4.0及以上版本默认序列化格式版本为3,警告信息显示保存文件时使用了低于2的弃用版本,低版本格式的魔术号不符合当前R版本的校验规则,也会触发该报错。
- 文件损坏:保存RDS过程中出现程序中断、磁盘空间不足、跨设备传输时使用ASCII模式而非二进制模式,都会导致文件结构损坏,读取时无法识别魔术号。
解决方案
- 修正读取函数:确认使用
readRDS()读取RDS文件,不要混用load(),推荐使用file.path自动适配不同操作系统的路径分隔符,避免手动拼接错误,正确读取代码示例:res <- readRDS(file.path(dataPath, "result.rds")) - 保存时指定兼容的版本号:重新保存文件时明确指定序列化版本为2或3,避免使用已弃用的低版本,保存代码示例:
# 若需要兼容R 3.5以下版本,可将version参数改为2 saveRDS(res, file = file.path(dataPath, "result.rds"), version = 3) - 重新生成文件:如果原RDS文件已损坏,重新运行生成
res对象的代码,完成保存后先执行一次本地读取测试,确认文件可用。 - 跨设备传输RDS文件时,使用二进制传输模式,避免文件结构被破坏。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

