首页 > 解决方案 > 在多线程池中传递 groupby 时内存泄漏

问题描述

虽然我通过完全改变我的算法解决了我的问题,但我仍然很好奇为什么我的第一种方法有内存泄漏,见下文。

我想处理熊猫数据框中的组。我用:

def function(template_df,group):
    for row in group.iterrows():
       ** edit template_df **
    return template_df

if __name__ == '__main__':
    with Pool(processes=6) as pool:
            multiple_results = [pool.apply_async(function,(template_df,group)) for name,group in dataframe.groupby(['Col1'])]
            results_all = [res.get() for res in multiple_results]
            pool.close()
            pool.terminate()
            pool.join() 

for i in range(0,len(results_all)):
    meta_df= meta_df.add(results_all[i])

results_all =[]
multiple_results = []

该函数返回一个由每组中的数据编辑的小数据框。然后我将这些小数据框合并为一个。

主数据框中有很多组,是的,保存了数以万计的模板数据框,但它们只有 150x150 元素大,而我的系统有 110 GB 的 RAM,所以应该没问题。
事实上,这份results_all名单并没有那么大。将其设置为零不会释放任何内存,multiple_results.

我已经检查了我所有的变量sys.getsizeof,它们都没有超出预期的增长,实际上大多数都没有增长,因为它们是固定大小的数据框。然而,内存占用量只会增加。我处理的主数据帧的每一百万行占用 30GB 的 RAM,而我正在删除我正在创建的新 template_df。

我在这里想念什么?

解决方案:我更改了函数以输出索引列表以重新创建模板数据帧,因此我可以切换到映射函数并将组作为可迭代对象传递。这完全解决了内存泄漏。
很明显,从池中传递/返回数据帧是一个问题。
...

但是谁能告诉我第一种方法的问题是什么?

标签: python-3.xmultithreadingpandasthreadpoolpandas-groupby

解决方案


推荐阅读