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

Python中groupby函数出现内存不足的异常行为求助

问题:小型Pandas DataFrame执行GroupBy聚合时触发内存不足错误

处理一个仅813行16列的小型pandas DataFrame,执行如下groupby聚合操作时触发内存不足错误:

fm = fm.groupby(['Tower_ID'                 ,'Cell_ID'                 ,'Alarm ID'                 ,'Severity'                 ,'Alarm Type'                 ,'Alarm Text'                 ,'Supplementary Info'                 ,'PERIOD_START_TIME'                 #,'File_Name'                ]
               ).agg({'Full_Start_Date': 'min'
                      ,'Full_End_Date': 'max'
                      ,'Alarm hold time (sec)': 'sum'
                      ,'End_Date': 'max'
                      ,'Cross_Over': 'max'
                      ,'Cross_Over_diff': 'max'
                     }
                    )

错误信息:

numpy.core._exceptions._ArrayMemoryError: Unable to allocate 11.1 GiB for an array with shape (1485993600,) and data type int64

已尝试更换变量名、调整列数据类型,均无法解决;仅将该DataFrame保存为Excel文件后重新读取,groupby操作才能正常执行,但这个临时方案效率极低,需要了解问题原因并获得更好的解决办法。


问题原因分析

  • DataFrame元数据/内存结构异常:原DataFrame可能在之前的操作中出现了索引混乱、列内存指针错误或隐性内存泄漏,导致groupby内部计算时生成了错误尺寸的临时数组;保存再读取相当于重置了DataFrame的元数据与内存结构,修复了异常。
  • 分组键类型导致的内存膨胀:分组键中的多列object类型文本列,在groupby过程中会被内部处理为哈希映射,若列存在大量重复但未被优化为高效类型,可能意外生成超大的临时索引数组,触发远超预期的内存占用。
  • pandas分组逻辑的临时内存峰值:一次性多列聚合可能导致内存占用叠加,小型DataFrame也可能因内部计算逻辑的临时数组生成机制,出现内存异常飙升。

优化解决办法

1. 重置DataFrame结构(替代存Excel方案)

直接生成干净的DataFrame副本,清理可能存在的元数据异常:

fm = fm.reset_index(drop=True).copy()

2. 优化分组键数据类型

将分组键中的文本列转换为Categorical类型,大幅降低分组时的内存开销:

group_cols = ['Tower_ID', 'Cell_ID', 'Alarm ID', 'Severity', 'Alarm Type', 'Alarm Text', 'Supplementary Info', 'PERIOD_START_TIME']
for col in group_cols:
    fm[col] = pd.Categorical(fm[col])

3. 分步骤执行聚合操作

避免一次性多列聚合导致的内存峰值,拆分聚合步骤:

grouped = fm.groupby(group_cols)
fm_agg = pd.DataFrame()
fm_agg['Full_Start_Date'] = grouped['Full_Start_Date'].min()
fm_agg['Full_End_Date'] = grouped['Full_End_Date'].max()
fm_agg['Alarm hold time (sec)'] = grouped['Alarm hold time (sec)'].sum()
fm_agg['End_Date'] = grouped['End_Date'].max()
fm_agg['Cross_Over'] = grouped['Cross_Over'].max()
fm_agg['Cross_Over_diff'] = grouped['Cross_Over_diff'].max()
fm = fm_agg

4. 手动触发垃圾回收

释放之前操作残留的内存,再执行groupby:

import gc
gc.collect()

5. 排查列的实际内存占用

用以下命令查看每列的深层内存占用,定位是否有隐性的超大内存消耗列:

print(fm.memory_usage(deep=True))

内容的提问来源于stack exchange,提问作者Bruno Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:52:12