使用pandas MultiIndex出现内存泄漏问题(附最小复现示例)
MultiIndex 导致内存异常增长问题排查
我通过pd.MultiIndex组织时间轨迹矩阵,实现将多条时间轨迹平均到指定数量分箱的功能。但运行时内存占用远超预期:最终生成的output数组仅占6MB,而循环执行过程中内存增长超过200MB。对比未使用MultiIndex的相似逻辑代码,不存在这种内存异常增长的情况,我怀疑是pd.MultiIndex存在bug,也可能是自己代码有疏漏,恳请帮忙排查。
复现代码
import numpy as np import pandas as pd # 单条轨迹长度 trace_len = 2500 # 分箱数量 bin_num = 300 # 轨迹矩阵维度 L1 = 70 L2 = 100 index = pd.MultiIndex.from_product([range(L1), range(L2)]) traces = np.random.random((L1*L2, trace_len)) traces_df = pd.DataFrame(traces, index=index) # 生成300个随机分箱 bins = [index.to_frame().sample(frac=1, replace=True) for _ in range(bin_num)] bins = [pd.MultiIndex.from_frame(bin) for bin in bins] def bin_single(traces: pd.DataFrame, bin_idx: pd.Index) -> np.array: """ 计算同时存在于traces和bin_idx中的所有轨迹的累积和 """ bin_idx = bin_idx.intersection(traces.index) binned = traces.reindex(bin_idx, copy=False) return binned.sum(axis=0, skipna=False).to_numpy() output = np.empty((bin_num, trace_len)) for n, bin in enumerate(bins): output[n] = bin_single(traces_df, bin) print(output.nbytes)
内存变化情况

未使用MultiIndex的对比代码
import numpy as np import pandas as pd # 单条轨迹长度 trace_len = 2500 # 分箱数量 bin_num = 300 # 轨迹矩阵维度 L1 = 70 L2 = 100 traces = np.random.random((L1*L2, trace_len)) traces_df = pd.DataFrame(traces) index = traces_df.index # 生成300个随机分箱 bins = [index.to_frame().sample(frac=1, replace=True) for _ in range(bin_num)] bins = [pd.MultiIndex.from_frame(bin) for bin in bins] def bin_single(traces: pd.DataFrame, bin_idx: pd.Index) -> np.array: """ 计算同时存在于traces和bin_idx中的所有轨迹的累积和 """ bin_idx = bin_idx.intersection(traces.index) binned = traces.reindex(bin_idx, copy=False) return binned.sum(axis=0, skipna=False).to_numpy() output = np.empty((bin_num, trace_len)) for n, bin in enumerate(bins): output[n] = bin_single(traces_df, bin) print(output.nbytes)
内容的提问来源于stack exchange,提问作者pnjun
相关产品推荐
相关产品推荐

