R筛选缩小数据框后内存未释放问题求助
R会话内存占用未释放的现象是否正常?
我在Linux系统使用R 4.2.1版本,读取一个大于10Gb的.Rds文件(尝试过base包和readr包的读取函数),此时内存占用达14.58Gb。之后我将数据框缩小至800行、24.7Mb,但无论执行何种操作,该R会话的内存占用始终没有降低。我已尝试以下方法:
- 将
readRDS直接通过管道传入筛选函数,仅保留筛选后的结果 - 先将RDS文件读取到变量中,再用筛选后的结果覆盖该变量
- 将RDS文件读取到变量中,把筛选后的数据存入新变量,再用
rm()删除原大数据集并执行垃圾回收gc()
我知道可行的解决方案是用bash脚本先生成缩小后的临时数据集,再启动独立R会话处理,但疑惑这种内存不释放的现象是否正常?
这种现象是正常的,核心原因在于R的内存管理机制:
- 内存归还策略:R向系统申请内存后,默认不会主动将未使用的内存归还操作系统。即便你删除大对象并执行
gc(),R只是把这些内存标记为内部可复用的空闲空间,系统层面的内存占用不会下降。 - 拷贝-on-modify特性:处理大对象时,R的拷贝-on-modify机制可能会生成临时对象,这些临时对象的内存片段可能无法被彻底清理,尤其是超大数据集的读取和操作过程中,部分内存会被保留。
- 读取工具的缓存:readr等包的读取函数可能存在额外内存缓存,读取大数据集时占用的内存不会随最终小数据集的保留而主动归还系统。
除了用bash预处理后启动新R会话,还有两个可选操作:
- 执行
gc(full=TRUE),强制触发完整垃圾回收,部分场景下能释放少量内存给系统,但效果不固定 - 重启当前R会话(本质和启动独立会话一致)
内容的提问来源于stack exchange,提问作者George B. Y.
相关产品推荐
相关产品推荐

