虽然我通过完全改变算法来解决问题,但我仍然对为什么我的第一种方法会发生内存泄漏感到好奇,
我想处理熊猫数据框中的组。我使用:
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传递/返回数据帧的问题。
...
但是谁能告诉我第一种方法的问题是什么?