如何解决R运行代码处理400万行数据集时的内存耗尽报错问题
解决方案
方案1:优化dplyr执行逻辑,减少内存占用
原代码最大的内存开销来自直接对全量400万行的完整数据集做操作,没有提前裁剪不需要的列,优化后代码如下:
- 第一步先仅提取计算需要的2列,释放原数据集占用的内存
# 仅保留需要的列,大幅降低数据集体积 all_year_small <- all_year %>% select(member_casual, start_station_name) # 删除原数据集,立即执行垃圾回收释放内存 rm(all_year) gc() # 后续处理基于裁剪后的小数据集运行 stations2 <- all_year_small %>% # 直接过滤掉空值和空字符串,不需要先转NA再删,减少中间向量生成 filter(start_station_name != "", !is.na(start_station_name), !is.na(member_casual)) %>% # 不需要单独跑unique(),如果是统计两类用户的总出行次数,这步完全多余;如果你确实需要先去重所有完全相同的行再计数,可以在这里加一行distinct(member_casual, start_station_name, .keep_all = TRUE) group_by(member_casual, start_station_name) %>% summarise(trip_number = n(), .groups = 'drop') %>% pivot_wider(names_from = member_casual, values_from = trip_number, values_fill = 0) # 处理完后释放临时小数据集 rm(all_year_small) gc()
方案2:改用内存效率更高的data.table包处理
如果优化dplyr逻辑后仍内存不足,可以换用data.table,它对大数据集的内存占用和处理速度都比tidyverse系列更优:
library(data.table) # 把数据集转成data.table格式 setDT(all_year) # 仅保留需要的列 all_year <- all_year[, .(member_casual, start_station_name)] # 直接处理,无中间冗余对象 stations2 <- all_year[start_station_name != "" & !is.na(start_station_name) & !is.na(member_casual), .(trip_number = .N), by = .(member_casual, start_station_name)] # 转宽格式 stations2 <- dcast(stations2, start_station_name ~ member_casual, value.var = "trip_number", fill = 0)
方案3:调整R内存上限(仅Windows系统适用)
如果是Windows系统,可以提前调整R的最大可用内存,给处理留出更多空间:
- 运行前先执行
memory.limit(size = 16384),单位为MB,示例为设置最大可用内存16G,可根据设备实际物理内存调整,建议不要超过设备物理内存的80%。
内容的提问来源于stack exchange,提问作者NIKOLAOS RAPANIS
相关产品推荐
相关产品推荐

