Python变量重分配内存管理:Numpy/Pandas操作峰值内存是1倍还是2倍
问题解答
1. Numpy数组场景的内存峰值判断
你原来的理解是正确的,该场景内存峰值为2GB。
原因:numpy执行array + 1运算时,默认会生成全新的数组存储计算结果,运算全程都需要读取旧数组的完整数据,因此运算结束、新数组完全生成前,旧数组不会被释放,二者会同时占用内存。直到赋值语句执行完成,旧数组的引用计数归零后才会被回收,峰值自然达到2GB,和垃圾回收的速度无关。
2. Pandas官方示例的理解误区
你误解的核心是没有区分运算对象的体积差异,两个场景的运算逻辑完全不同:
- 你默认
counts.add(...)是两个大体积对象相加,但实际df["name"].value_counts()返回的是name列的唯一值统计结果,体积和原df完全不在一个量级:哪怕单块parquet加载后的df有几GB大,只要name列的唯一值数量只有几千、几万,value_counts返回的Series大小往往只有KB级,和原df体积相比可以忽略。 - 整个循环过程中,最大的内存占用只有
pd.read_parquet(path)加载的单块df的内存,后续的value_counts、累计相加操作涉及的都是极小的统计对象,不会出现两个大体积对象并存的情况,因此内存峰值就是官方描述的「最大单块数据内存 + 小体积累计Series内存」。
如果把pandas示例的逻辑改成两个全量大DataFrame直接相加,内存峰值也会达到2倍单块大对象的体积,和numpy场景的表现一致。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

