python-3.x - 在多线程池中传递 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 - 如何在 Jupyter 单元上运行 PIP 安装命令
- git - Fedora-33 上的 git(1) CLI 在创建 SSH 密钥对并将其添加到 Azure DevOps(或 GitHub)后请求密码 - (以下步骤)
- node.js - GCP Cloud Run 503 错误:长时间运行请求的服务不可用
- memory - SceneKit 高内存使用率
- r - 如何使用特定的列顺序计算累积和?
- c++ - GNU makefile 中过滤器的必要性
- php - 在 laravel 中写入 oauth 密钥文件的安全位置
- php - 从动态下拉菜单 PHP 将数据更改发布到数据库
- java - 本地计算机和服务器之间的行为差异
- git - 将 GIT 分支推送到 heroku master