【问题标题】:Memory Leakage with ThreadPoolExecutor python使用 ThreadPoolExecutor python 的内存泄漏
【发布时间】:2021-07-02 03:06:09
【问题描述】:

我有一个获取一些 id 的进程,并基于这些 id,我从数据库中获取(熊猫)数据帧,经过一些处理后,数据帧使用 to_csv 存储到文件系统,然后使用 @ 删除数据帧987654321@.

数据帧的获取和处理是使用 ThreadPoolExecutor 完成的。

with futures.ThreadPoolExecutor(max_workers=number_of_workers) as executor:
  return list(executor.map(func, args))

func 是流程,args 是客户 ID。

尽管 del 和线程预计会结束,但我看到内存使用仍然存在,我的预感是数据帧仍然存在于内存中。

我怎样才能清理内存..??

PS:我也试过 gc...没用

【问题讨论】:

    标签: python multithreading memory-management memory-leaks threadpoolexecutor


    【解决方案1】:

    在清理内存之前,你必须了解什么是累积的。

    运行序列几十次并收集一个活跃的核心(例如,使用 gcore),或者确保您的“ulimit -c”值是这样的,您可以在进程终止时创建一个核心并运行序列在一个循环中直到它死亡。

    当你有一个合适的内核时,用 chap 打开它,查看 (https://github.com/vmware/chap) 并从以下命令开始:

    redirect on
    summarize leaked
    summarize used /sortby bytes
    

    如果确实存在泄漏,就不再可访问的分配而言,summarize leaked 的结果会告诉您这一点。如果没有泄漏,summarize used /sortby bytes 的输出应该可以让您很好地了解下一步该往哪里看。

    可能有一些与 pandas 相关的巨大缓冲区。您可以通过

    找到它们
    summarize used /minsize 100000
    

    然后从那里跟随传入的边缘。如果您遇到困难,请发布摘要中的部分结果,我可能会让您摆脱困境。

    【讨论】:

    • 好的...这是一个很好的建议...不幸的是我没有奢侈的应用自定义虚拟机和所有...如果可以完成诸如内存分析器之类的事情,那么我也许可以试试看……
    • 为什么需要自定义虚拟机?是不是你没有在 Linux 上运行的问题?
    • 我的意思是我受限于执行 python 运行时的命令...
    • 我还不清楚为什么这会阻止你至少收集一个活的核心。如果您在 Linux 上,并且您知道进程的 pid:gcore
    • 它是一个正在使用的自定义环境,我们无法实时访问运行时操作系统和所有...我们只是将二进制文件传递给环境...有什么我们可以做的吗?从 python 脚本内部执行..??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    • 1970-01-01
    • 2016-06-11
    • 2015-02-15
    相关资源
    最近更新 更多