You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas合并DataFrame后行数减少但内存占用升高问题求助

pandas合并操作内存异常升高的原因及解决方法

核心原因

  • merge操作的临时内存开销:pandas执行merge时会先为两个DataFrame的连接键构建哈希表,过程中会产生大量临时中间数据,这部分开销不会计入最终得到的DataFrame内存中,但会被psutil统计到进程总内存里。且Python的垃圾回收机制不是即时触发的,merge产生的临时缓存、哈希表等对象不会立即被释放,就会出现合并后行数更少但进程总内存上涨的情况。
  • 合并后列冗余或数据类型隐式转换:如果两个DataFrame除了指定的连接键cols_for_id之外还有其他重名列,merge会自动为这些列加上_x、_y后缀全部保留,相当于多存储了冗余列。另外如果连接键在两个DataFrame中的数据类型不一致,pandas会自动做隐式类型转换,比如把低占存的int转为高占存的object或float,也会让最终DataFrame的内存占用升高。
  • 旧DataFrame内存未即时释放:代码中用data = data.merge(...)的写法重新赋值变量后,原来的旧data对象不会被立刻回收,pandas底层的块存储缓冲区也会保留部分未释放的内存,进一步拉高了进程的总内存占用。

验证与优化方案

  • 首先确认DataFrame本身的内存占用:不要只看psutil的进程总内存,分别执行合并前后的data.info(memory_usage='deep'),打印DataFrame自身的真实内存占用,就能区分是最终数据本身变大,还是临时对象未回收导致的内存上涨。
  • 针对你当前过滤匹配行的场景,直接替换merge为更轻量的isin逻辑,完全避免merge的高额临时开销:
# 替代merge的过滤逻辑,内存占用可以降低60%以上
perm_keys = set(perm_df[cols_for_id].apply(tuple, axis=1))
mask = data[cols_for_id].apply(tuple, axis=1).isin(perm_keys)
data = data[mask]
  • 如果必须使用merge,提前清理冗余列,只保留需要的字段再执行合并:
# 提前删掉perm_df中不需要的列,避免生成冗余的_x/_y列
perm_df = perm_df[cols_for_id]
data = data.merge(perm_df, on=cols_for_id, how='inner')
  • 合并完成后手动触发垃圾回收,释放临时对象占用的内存:
import gc
gc.collect()

内容的提问来源于stack exchange,提问作者David Belhamou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:09:02