在多线程池中通过groupby时发生内存泄漏

时间:2019-04-11 09:24:04

标签: python-3.x multithreading pandas threadpool pandas-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。

我在这里想念什么?

解决方案:我将函数更改为输出索引列表,以重新创建模板数据框,因此我可以切换到map函数,并仅将组作为可迭代对象传递。这样就彻底解决了内存泄漏。
很明显,这是从Pool传递/返回数据帧的问题。
...

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

0 个答案:

没有答案