Python 的多处理和内存

2023-12-29

我在用multiprocessing.imap_unordered对值列表执行计算:

def process_parallel(fnc, some_list):
    pool = multiprocessing.Pool()
    for result in pool.imap_unordered(fnc, some_list):
        for x in result:
            yield x
    pool.terminate()

每次致电fnc根据设计,返回一个巨大的对象作为结果。我可以在 RAM 中存储此类对象的 N 个实例,其中 N ~ cpu_count,但不能更多(不是数百)。

现在,使用这个功能占用了太多的内存。内存完全消耗在主进程中,而不是消耗在工作进程中。

如何imap_unordered存储完成的结果?我的意思是工作人员已经返回但尚未传递给用户的结果。我认为它很聪明,只根据需要“懒惰地”计算它们,但显然不是。

看起来因为我无法消费结果process_parallel足够快,池不断地对这些巨大的对象进行排队fnc某处,内部,然后爆炸。有办法避免这种情况吗?以某种方式限制其内部队列?


我使用的是Python2.7。干杯。


通过查看相应的源文件可以看到(python2.7/multiprocessing/pool.py),IMapUnorderedIterator 使用collections.deque用于存储结果的实例。如果出现新项目,则会在迭代中添加和删除它。

正如您所建议的,如果在主线程仍在处理该对象时另一个巨大对象进入,这些对象也将存储在内存中。

你可能会尝试的是这样的:

it = pool.imap_unordered(fnc, some_list)
for result in it:
    it._cond.acquire()
    for x in result:
        yield x
    it._cond.release()

如果任务结果接收器线程尝试将下一个对象放入双端队列,那么在处理项目时,这应该会导致任务结果接收器线程被阻塞。 因此内存中的大对象不应超过两个。 如果这适用于你的情况,我不知道;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 的多处理和内存 的相关文章

随机推荐

  • 我可以使用

    看到标签的用法很常见
  • 华为或vivo手机如何修复“应用程序感染病毒”

    我用我写的代码做了一个apk 当我使用华为或vivo手机下载apk时 浏览器显示提示 该应用程序感染了病毒 如何修复它 在华为设备中测试我的应用程序时 我遇到了类似的警告 我直接点击继续安装 华为似乎会将所有非应用商店的内容视为病毒 现在我
  • asp.Net MVC 2 应用程序上没有样式/图像

    问候 我的 ASP MVC 应用程序有一个小问题 在我的本地开发服务器上 一切正常 但当我尝试将应用程序发布到 IIS 7 0 服务器时 它只显示没有任何样式 标记 图像的纯页面 我将所有这些内容放在 Content 子文件夹中 但是当我尝
  • 循环文件记录

    我想知道是否有 C 的记录器库可以进行循环文件日志记录 我目前正在研究 log4C 但找不到足够的文档来说明它会进行循环日志记录 如果有人这样做过 请告诉我 Thanks 这是一个例子 这是一个删减版本 在我们的系统中 我们使用 vargs
  • 使用自定义可解码解码 Firestore 结构时获取 DocumentID

    我有以下结构 struct Vehicle Codable Identifiable DocumentID var id String var name String 只要我使用默认的 Swift 解码器 我就可以毫无问题地加载 Fires
  • 使用类路径参数运行 jar

    我可能错过了一些愚蠢的东西 但仍然如此 我创建了一个具有以下内部结构的 jar 文件 folder1 folder2 META INF 资源 其中folder1和folder2包含 class文件 而resources包含txt和png文件
  • 来自主 Gui 模块外部的 PyQt5 中断关闭事件

    我使用 Qt Designer 构建 GUI 并使用 pyuic5 将它们转换为 py 文件 我的最终目标是当变量 1 时中断用户关闭程序并向他们显示 您确定要关闭吗 类型对话框 如果所述变量 0 则正常关闭程序 我见过很多关于如何执行此操
  • C# 访问字段语法

    如果我只有要访问的变量的名称 我将如何访问对象的变量值 在 C 中 假设我有一个变量名称列表 表示为数组中的字符串 例如 我如何循环访问它们 我可以在 Actionscript 中执行类似以下操作 var arrayOfVariableNa
  • 如何从我的 makefile 中调用特定目标?

    a echo 1 b echo 2 c if d somefolder then how do I invoke target b here fi 我如何调用目标b内部目标c 根据我的情况 有点像antcall 如果你熟悉 ant 的话 说
  • 如何在 MiUi pre - Marshmallow 中请求权限?

    int permissionCheck ContextCompat checkSelfPermission mActivity Manifest permission RECEIVE SMS ActivityCompat requestPe
  • 如何确定应用程序中使用了哪些 JAR

    现有应用程序的类路径中有大量 JAR 文件 为了确定起见 最初必须有人添加所有 JAR 有些 JAR 显然没有被使用 我们已经删除了其中一些不需要的 JAR 没有造成任何问题 如何确定哪些 JAR 正在使用 哪些 JAR 不需要 除了试错法
  • Django 性能测试套件将报告指标(数据库查询等)

    我有一个复杂的 Django Web 应用程序 其中投入了很多人年的工作 有时可能需要优化 我可以使用 例如 django 的测试客户端编写几个常见的操作 流程的脚本 是否有一些程序 给定这样的 python 脚本 然后将运行 并报告各种
  • C++ 投掷类成员

    我有以下 C 代码 template
  • 查找数组中的重复元素?

    我看到一个面试题是这样的 数组中有一个数字重复 找到它 简单的解决方案如下 for int i 0 i
  • REST API 的试运行策略

    我正在寻找 REST API 的 试运行 操作的一些最佳实践 假设我有一个端点将资金从账户 A 转账到账户 B 我可以像这样发起转账 POST transactions amount 1000 how much to transfer so
  • jQuery 数据绑定 - 现在流行的插件是什么?

    我需要某种类型的 JS MVC DataBinding 解决方案 与实施 GMAIL Web 应用程序类似 消息索引和消息显示 在消息显示的位置 如果您修改消息 它会自动在消息索引中更新 我应该学习什么插件才能在不使用大量 jQuery 的
  • Tensorflow 中的入队和增量变量

    如何使张量流图将递 增的数字推送到队列 我这样做只是为了学习目的 所以我希望您保持它与我正在做的事情相似 并纠正我做错的事情 这是我的代码 import tensorflow as tf create queue queue tf Rand
  • 通过 attr_accessor 对模型对象进行排序

    当我必须对对象列表进行排序时 我认为 attr accessor 具有与另一个相同的行为 但似乎有所不同 dataRecords MyData where day Time now yesterday strftime Y m d to i
  • 仅禁用自动生成的表单上的特定“绿色加号”图标

    如何在自动生成的表单中禁用特定 manytomany 或 foreignkey 字段上的绿色图标 使用CSS如下 add another display none 禁用所有我不想要的 一个例子是工作日模型 存储从星期一到星期日的天数 指向该
  • Python 的多处理和内存

    我在用multiprocessing imap unordered对值列表执行计算 def process parallel fnc some list pool multiprocessing Pool for result in poo