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

如何修复Python中分组求和时出现的MemoryError内存分配错误?

解决MemoryError的方案

问题根源:你添加的astype(np.int8)是在groupby求和完成后执行的,但求和过程中已经生成了占用13.1GiB的int64类型中间数组,此时内存已经耗尽,所以类型转换无法解决问题。需要从减少中间步骤的内存占用入手:

  • 提前转换原数据的 dtype
    先将原始数据转换为更小的数值类型(前提是数据值不会溢出),这样groupby求和时的中间数组也会使用更小的 dtype,降低内存占用:

    import numpy as np
    # 先确认数据的数值范围,选择合适的小类型(比如int8/int16/uint8)
    print("数据最小值:", out.min().min(), "数据最大值:", out.max().max())
    # 转换 dtype
    out = out.astype(np.int16)
    # 再执行groupby求和
    out = out.T.groupby(level=0, sort=False).sum().T
    

    注意:如果求和后的值超过目标 dtype 的范围,会触发溢出错误,需要根据实际数值范围选择合适的类型(比如int32如果数值较大)。

  • 分块处理数据
    将数据拆分成多个小块,逐个处理分组求和,最后合并结果,避免一次性加载整个大数组到内存:

    import pandas as pd
    import numpy as np
    # 按行拆分原数据的转置(即原数据的列)为多个块
    chunk_list = np.array_split(out.T, 15, axis=0)  # 可根据内存调整分块数量
    result_chunks = []
    for chunk in chunk_list:
        # 对每个块执行groupby求和
        chunk_result = chunk.groupby(level=0, sort=False).sum()
        result_chunks.append(chunk_result)
    # 合并所有块的结果并转置回原结构
    out = pd.concat(result_chunks).T
    
  • 使用Dask处理大数据集
    Dask可以自动分块并行处理数据,无需手动拆分,适合超出单机内存的数据集:

    import dask.dataframe as dd
    # 将pandas DataFrame转为Dask DataFrame,指定分区数
    ddf = dd.from_pandas(out, npartitions=10)
    # 执行分组求和并计算结果
    out = ddf.T.groupby(level=0, sort=False).sum().T.compute()
    
  • 优化分组逻辑
    检查level=0的分组是否必要:如果是MultiIndex结构,能否先通过重置索引、筛选等方式简化分组维度,减少分组后的结果规模,从根源降低内存需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:37:48