R保存小型列表耗时超24小时的原因及解决方案咨询
问题原因分析
- RStudio对象大小显示失真:右上角面板展示的是对象的「浅内存占用」,仅统计列表结构本身的内存,未包含其内部表格关联的底层数据。例如表格可能是大数据集的切片、或引用了ML训练过程中的大中间对象,实际内存占用远高于显示的971.2 kB。
- 内存碎片化严重:长时间运行计算与ML算法后,内存中堆积大量临时对象,导致内存碎片化。
save()序列化时需遍历整理内存对象,这一过程会大幅拖慢速度,同时临时占用大量内存。 - 默认压缩的额外开销:
save()默认启用压缩功能,即便单个列表体积不大,内存碎片化导致的数据读取不连续,会让压缩过程额外消耗大量时间与内存。 - 对象隐式引用:R对象可能通过环境、闭包等关联大对象,即便仅指定保存5个列表,序列化时仍需处理这些隐藏引用,引发耗时与内存暴涨。
解决办法
- 清理环境并强制垃圾回收:移除无关对象,回收闲置内存后再执行保存:
# 定义需保留的对象 keep_objs <- c("list1", "list2", "list3", "list4", "list5") # 删除其他所有对象 rm(list = setdiff(ls(), keep_objs)) # 强制垃圾回收 gc(verbose = FALSE) # 执行保存 save(list = keep_objs, file = "mypath/mylists.RData") - 使用saveRDS()替代save():
saveRDS()针对单个对象序列化,效率远高于save(),建议将所有列表打包为一个对象后保存:combined_lists <- list(list1 = list1, list2 = list2, list3 = list3, list4 = list4, list5 = list5) saveRDS(combined_lists, file = "mypath/all_lists.rds") # 读取时调用 readRDS("mypath/all_lists.rds") - 关闭保存时的压缩:若文件体积不是限制因素,关闭压缩可大幅提升保存速度:
save(list1, list2, list3, list4, list5, file = "mypath/mylists.RData", compress = FALSE) - 校验对象真实内存占用:用
pryr包的object_size()获取对象实际内存,确认是否存在隐藏的大关联对象:
若结果远大于971.2 kB,需断开表格与原大对象的引用,例如用install.packages("pryr") pryr::object_size(list1)data.table::copy()复制表格:# 针对data.table类型的表格 list1[[1]] <- data.table::copy(list1[[1]]) list1[[2]] <- data.table::copy(list1[[2]]) # 其他列表内的表格同理处理后保存 - 重启R会话:彻底清除内存碎片,重启后仅加载目标列表,直接执行保存操作,规避之前会话的内存混乱。
内容的提问来源于stack exchange,提问作者miamialan
相关产品推荐
相关产品推荐

