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
相关产品推荐
相关产品推荐

