使用 Python 多处理的高内存使用率

2024-03-08

我看过几篇关于使用 Python 多处理模块的内存使用情况的帖子。然而这些问题似乎并不能回答我在这里遇到的问题。我将我的分析发表出来,希望有人能帮助我。

Issue

我正在使用多处理并行执行任务,我注意到工作进程的内存消耗无限增长。我有一个小的独立示例,应该可以复制我注意到的内容。

import multiprocessing as mp
import time

def calculate(num):
    l = [num*num for num in range(num)]
    s = sum(l)
    del l       # delete lists as an  option
    return s

if __name__ == "__main__":
    pool = mp.Pool(processes=2)
    time.sleep(5)
    print "launching calculation"
    num_tasks = 1000
    tasks =  [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
    for f in tasks:    
        print f.get(5)
    print "calculation finished"
    time.sleep(10)
    print "closing  pool"
    pool.close()
    print "closed pool"
    print "joining pool"
    pool.join()
    print "joined pool"
    time.sleep(5)

System

我正在运行 Windows,并使用任务管理器来监视内存使用情况。我正在运行Python 2.7.6。

观察

我总结了下面2个工作进程的内存消耗。

+---------------+----------------------+----------------------+
|  num_tasks    |  memory with del     | memory without del   |
|               | proc_1   | proc_2    | proc_1   | proc_2    |
+---------------+----------------------+----------------------+
| 1000          | 4884     | 4694      | 4892     | 4952      |
| 5000          | 5588     | 5596      | 6140     | 6268      |
| 10000         | 6528     | 6580      | 6640     | 6644      |
+---------------+----------------------+----------------------+

在上表中,我尝试更改任务数量并观察所有计算结束时和之前消耗的内存join-ing 的pool。 'del' 和 'without del' 选项是我是否取消注释或注释del l线内的calculate(num)分别发挥作用。计算前,内存消耗在4400左右。

  1. 看起来手动清除列表会降低工作进程的内存使用量。我以为垃圾收集器会处理这个问题。有没有办法强制垃圾收集?
  2. 令人费解的是,随着任务数量的增加,这两种情况下的内存使用量都在不断增长。有没有办法限制内存使用?

我有一个基于此示例的流程,旨在长期运行。我观察到这个工作进程在一夜运行后占用了大量内存(~4GB)。做一个join释放内存不是一个选择,我正在尝试找出一种不使用内存的方法join-ing.

这似乎有点神秘。有人遇到过类似的事情吗?我该如何解决这个问题?


我做了很多研究,但找不到解决问题本身的解决方案。但是有一个不错的解决方法可以以很小的成本防止内存溢出,特别是在服务器端长时间运行的代码上。

解决方案本质上是在完成固定数量的任务后重新启动各个工作进程。这Poolpython 中的类需要maxtasksperchild作为一个论点。您可以指定maxtasksperchild=1000从而限制每个子进程运行 1000 个任务。到达后maxtasksperchildnumber,池刷新其子进程。使用谨慎的最大任务数,可以平衡消耗的最大内存和与重新启动后端进程相关的启动成本。这Pool施工如下:

pool = mp.Pool(processes=2,maxtasksperchild=1000)

我将完整的解决方案放在这里,以便对其他人有用!

import multiprocessing as mp
import time

def calculate(num):
    l = [num*num for num in range(num)]
    s = sum(l)
    del l       # delete lists as an  option
    return s

if __name__ == "__main__":

    # fix is in the following line #
    pool = mp.Pool(processes=2,maxtasksperchild=1000)

    time.sleep(5)
    print "launching calculation"
    num_tasks = 1000
    tasks =  [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
    for f in tasks:    
        print f.get(5)
    print "calculation finished"
    time.sleep(10)
    print "closing  pool"
    pool.close()
    print "closed pool"
    print "joining pool"
    pool.join()
    print "joined pool"
    time.sleep(5)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 多处理的高内存使用率 的相关文章

随机推荐

  • Laravel 属于通过类似关系

    现在我有这些方法 程序 php public function institute return this gt belongsTo Institute class institute id gt withTrashed User php
  • 访问selenium中的css类属性

    我有一个 HTML div 元素并希望使用 Selenium 检查它是否左对齐 但是 那float leftCSS 属性在 CSS 类中定义 有什么方法可以通过 Selenium 访问 CSS 类属性吗 或者还有其他方法可以获取这个值吗 d
  • jQuery mobile - Pagecontainer 从 DOM 中消失

    在 jQuery mobile 中 我想从外部文件加载页面容器 我可以将标记添加到我的 DOM 中 但之后我面临的问题是 一旦导航到 page2 整个 page1 div 就会从 DOM 中消失 因此我无法返回 请参见下面的屏幕截图 单击
  • 如何从iPhone sdk中的城市名称获取位置(坐标)?

    friends 因为我们在android中有google api的geocoder getfromlocation locationname maximumResults 函数 我在 iphone sdk 中没有看到这样的函数来从城市名称获
  • 在 Linux 中调试 C++ 程序

    我写了一个简单的 C 程序 如下所示 include
  • 截断文本并在鼠标悬停时显示它

    我需要截断文本 末尾带有 并且将鼠标悬停在整个文本上时应该展开 我尝试用下面的代码截断 此代码的问题是 它会在单击时展开内容 但我需要当用户将鼠标悬停在 p 标签上的任何位置时打开它 var len 100 var p document g
  • 阻止滚动以及展开/折叠可折叠工具栏

    我正在使用Collapsible Toolbar在我的应用程序中 活动启动时可折叠工具栏处于展开状态 启用滚动并且正常工作 但现在我需要显示全屏错误布局 以防我的 API 失败 在这种情况下 我必须折叠工具栏并阻止滚动效果 错误布局显示重试
  • Spark hivecontext 的查询会锁定 hive 表吗?

    我知道如果我从 Hive 提交查询 将获取共享锁 然后 Hive 表将被查询锁定 https cwiki apache org confluence display Hive Locking https cwiki apache org c
  • 实现下拉菜单项颤动的复选框

    如何在flutter应用程序中实现下拉菜单项的复选框 每个里面DropdownMenuItem 你可以有Row作为一个孩子 你可以通过CheckBox其次是Text 帮助您入门的示例工作代码 body Center child Dropdo
  • 获取 ntp 调整通知

    我的情况很奇怪 我需要一些有关 NTP 时间调整的指导 我有一台运行 NTP 守护进程的 PC Red Hat 这台 PC 通过 LAN 上的 Stratum 2 时间服务器调整其时间 我的 PC 还通过串行端口 RS 232 连接到 DV
  • 如何将 Vec<&mut T> 转换为 Vec<&T>?

    我有一个可变引用向量 struct T let mut mut vec Vec lt mut T gt vec 如何将它 的副本 传递到采用不可变引用向量的函数中 fn cool func mut immut vec Vec lt T gt
  • iPad IOS html 表单选择在触摸时无法打开

    我有一个选择框 通过以下方式创建
  • Vim 加载 vimrc 后是否加载插件?

    我正在尝试覆盖插件中设置的突出显示 该插件执行以下操作 highlight link WordUnderTheCursor Underlined 首先 我不知道 添加到highlight做任何事 但这无关紧要 在 vimrc 中做类似的事情
  • 使用异步函数订阅可观察对象是否安全

    我有一个以 50Hz 发送事件的事件发射器 我想使用异步方法订阅这个发射器 代码如下所示 this emitter fromEventPattern this addHandler this removeHandler err char g
  • org.hibernate.MappingException:属性映射在 ENUM 实体中的列数错误

    我创建了数据库 其中引用了 ENUM 表 并且该枚举的实体有例外 脚本示例 CREATE TABLE status code VARCHAR 40 status ENUM not started in progress finished i
  • 从 jquery 安全地调用我的 Web api

    我有一个简单的问题 可能会指出一个复杂的答案 我有一个运行良好的网络 API 但现在我想设置身份验证 授权 我需要它在所有平台上工作 但主要来自 jQuery 当然 我不想像这样以纯文本形式沿着管道发送我的用户名和密码 function G
  • 有没有办法加快 docker exec 的速度?

    有没有办法消除 docker exec 的开销 例如 当我打电话时docker exec ls在已经运行的容器上 需要0 15秒才能返回结果 root min time docker exec 6f ls bin boot dev etc
  • 制作 Silverlight 和常规 .NET REST 客户端的最便携方法是什么

    我正在尝试让服务器应用程序使用 WCF 公开一些状态信息 特别是我在使用带有 RESTful API 的 WCF 服务之后 当谈到从 silverlight 中使用 REST api 时 我遇到了一些困难 我想要作为附加类型的客户端的应用程
  • 如何在M1 Mac上安装Deepface(Python人脸识别包)?

    我正在尝试使用 deepface python 库 我已经按照中列出的指南安装了张量流https claytonpilat medium com tutorial tensorflow on an m1 mac using jupyter
  • 使用 Python 多处理的高内存使用率

    我看过几篇关于使用 Python 多处理模块的内存使用情况的帖子 然而这些问题似乎并不能回答我在这里遇到的问题 我将我的分析发表出来 希望有人能帮助我 Issue 我正在使用多处理并行执行任务 我注意到工作进程的内存消耗无限增长 我有一个小