在不耗尽 RAM 的情况下使用并发 Future

2024-01-16

我正在做一些文件解析,这是一个 CPU 密集型任务。无论我向该进程放入多少文件,它使用的 RAM 都不会超过 50MB。 该任务是可并行的,我已将其设置为使用下面的并发 future 将每个文件解析为单独的进程:

    from concurrent import futures
    with futures.ProcessPoolExecutor(max_workers=6) as executor:
        # A dictionary which will contain a list the future info in the key, and the filename in the value
        jobs = {}

        # Loop through the files, and run the parse function for each file, sending the file-name to it.
        # The results of can come back in any order.
        for this_file in files_list:
            job = executor.submit(parse_function, this_file, **parser_variables)
            jobs[job] = this_file

        # Get the completed jobs whenever they are done
        for job in futures.as_completed(jobs):

            # Send the result of the file the job is based on (jobs[job]) and the job (job.result)
            results_list = job.result()
            this_file = jobs[job]

            # delete the result from the dict as we don't need to store it.
            del jobs[job]

            # post-processing (putting the results into a database)
            post_process(this_file, results_list)

问题是,当我使用 futures 运行这个程序时,RAM 使用量猛增,不久之后我就用完了,Python 就崩溃了。这可能在很大程度上是因为 parse_function 的结果有几 MB 大小。一旦结果通过post_processing,应用程序不再需要它们。正如你所看到的,我正在努力del jobs[job]清除其中的项目jobs,但这没有什么区别,内存使用量保持不变,并且似乎以相同的速度增加。

我也确认这不是因为它正在等待post_process仅使用单个进程即可实现功能,再加上time.sleep(1).

futures 文档中没有任何关于内存管理的内容,虽然简短的搜索表明它之前已经在 futures 的实际应用中出现过(python循环中的清除内存 https://stackoverflow.com/questions/31720674/clear-memory-in-python-loop and http://grokbase.com/t/python/python-list/1458ss5etz/real-world-use-of-concurrent-futures http://grokbase.com/t/python/python-list/1458ss5etz/real-world-use-of-concurrent-futures) - 答案并不能转化为我的用例(它们都与超时等有关)。

那么,如何在不耗尽 RAM 的情况下使用并发 future? (Python 3.5)


我会尝试一下(可能是错误的猜测......)

您可能需要一点一点地提交您的工作,因为每次提交时您都会制作一份 parser_variables 的副本,这可能最终会占用您的 RAM。

这是有趣部分上带有“

with futures.ProcessPoolExecutor(max_workers=6) as executor:
    # A dictionary which will contain a list the future info in the key, and the filename in the value
    jobs = {}

    # Loop through the files, and run the parse function for each file, sending the file-name to it.
    # The results of can come back in any order.
    files_left = len(files_list) #<----
    files_iter = iter(files_list) #<------

    while files_left:
        for this_file in files_iter:
            job = executor.submit(parse_function, this_file, **parser_variables)
            jobs[job] = this_file
            if len(jobs) > MAX_JOBS_IN_QUEUE:
                break #limit the job submission for now job

        # Get the completed jobs whenever they are done
        for job in futures.as_completed(jobs):

            files_left -= 1 #one down - many to go...   <---

            # Send the result of the file the job is based on (jobs[job]) and the job (job.result)
            results_list = job.result()
            this_file = jobs[job]

            # delete the result from the dict as we don't need to store it.
            del jobs[job]

            # post-processing (putting the results into a database)
            post_process(this_file, results_list)
            break; #give a chance to add more jobs <-----
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不耗尽 RAM 的情况下使用并发 Future 的相关文章

  • Python设置1和True的解释

    在 IPython 3 交互式 shell 中 In 53 set2 1 2 True hello In 54 len set2 Out 54 3 In 55 set2 Out 55 hello True 2 是因为 1 和 True 得到
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

    我编写了一个小的 python 脚本来解析 提取 PDF 中的信息 我在本地机器上测试了它 我有 python 2 6 2 和 pdftotext 版本 0 12 4 我正在尝试在我的虚拟主机服务器 dreamhost 上运行它 它有 py
  • 将多索引转换为行式多维 NumPy 数组。

    假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http pandas pydata org pandas docs stable advanced html gt gt gt df 0 1 2 3 fir
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • python:函数中的变量,点前面是函数名

    我需要理解这个概念 其中我们可以在函数定义中的变量名中使用点 这里没有类定义 也没有模块 Python 不应该接受包含点的变量名 def f x f author sunder f language Python print x f aut
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示

随机推荐

  • 在 PostgreSQL 中对 JsonB 数组进行 Sequelize ORM 查询

    如何使用一些匹配条件和逻辑运算 lt et gte等 在 Jsonb 对象数组上 在 PostgreSQL 中使用 Sequelize ORM 表名 calls id direction metaData 1 inbound 2 outbo
  • 使用 Javascript 比较 HTML 中的两个输入数字?

    我正在使用 Notepad 创建一个简单的网页 用户在文本框中输入两个数字 然后按下按钮 当他们按下按钮时 会出现一些信息 告诉他们第一个数字还是第二个数字更大 我有以下代码 但无法得到任何结果 有谁知道出了什么问题吗
  • XML 新版本 - 新功能

    XML 有新版本了吗 如果是的话 它是什么时候发布的 有哪些新功能 目前 基本 XML 规范中的新功能不太可能出现 当然 XML 系列中的其他标准将会继续发展 但 XML 本身非常稳定 该标准有多个 版本 到目前为止为止是第五版 但这些仅仅
  • 如何在编译时推断嵌套 std::vector 的内部类型?

    有一天我问了一个非常类似的问题 https stackoverflow com questions 59490698 how can i get the depth of a multidimensional stdvector at co
  • 将多维数组转换为字符串并返回

    我有一个二维数组 我需要能够将其转换为字符串表示形式并返回数组格式 我想创建一个通用方法来处理任何数组 1d 2d 3d 等 这样我将来就可以重用该方法 解决这个问题的最佳方法是什么 string array new string help
  • 手动添加声明文件 (TypeScript)

    我没有找到 google spreadsheet 的声明文件 因此我尝试自己创建一个 在打字 gt 模块中 我添加了一个名为 google spreadsheet 的新文件夹 并在其中添加了一个名为 index d ts 的新文件 其中包含
  • 更新 Spring 注入的属性文件以包含上次运行时间戳

    我有一个应用程序 它使用 Spring 加载的属性文件 然后将 Properties 实例注入到几个类中 问题是其中一些属性已更新 例如我们有一个要存储在这里的lastRun时间戳 也许有更好的方法来存储这样的东西 欢迎建议 但是我该如何更
  • 对于具有相同分数的文档,主/副本的结果顺序不一致

    我创建了一个包含单个分片和 1 个副本的索引 我正在运行 ElasticSearch 版本 1 0 1 并且集群有 3 个节点 我注意到 有时具有相同分数的文档的结果排序是 根据是否针对主数据库和副本数据库运行相同的查询而有所不同 该查询是
  • 从 System.Windows.Media.Geometry 获取坐标列表

    Given a System Windows Media Geometry类实例 有没有一种简单的方法可以将其转换为轮廓和点列表 例如 我怎样才能简单地将其分解为一个列表LineSegments用于自定义渲染 FormattedText f
  • “springSecurityFilterChain”抛出异常;嵌套异常是 java.lang.IllegalArgumentException:提供程序列表不能包含空值

    在启动 SpringBoot 应用程序时 我不断收到以下错误 与我有关吗SpringWebSecurityConfig文件 以下是文件内容 Configuration public class SpringWebSecurityConfig
  • 如何从 System.Windows.Input.KeyEventArgs 获取按下的字符?

    I have System Windows Input KeyEventArgse 变量 我想得到真正的字符 例如 我按 键盘上的按钮 通常它会返回类似的字符串oem 但我想得到 字符 怎么做 编辑 我在 TextBox 中使用它 看到这个
  • 为什么加载后命令提示符消失了?

    使用下面的代码 命令提示符几乎在出现后立即消失 此代码不应该显示正在使用的所有可移动驱动器吗 using System Linq using System IO using System namespace ConsoleApplicati
  • 通过 cron 发布到 Facebook

    两天来我一直在尝试将从 Twitter 搜索收集的消息自动发布到我的 Facebook 页面之一 即通过 cronjob twitter 部分运行得很好 但我怎么也无法让 Facebook 部分工作 问题是我的脚本可以工作 直到它不能工作
  • Visual Studio 代码未加载我的 python 解释器

    在这个项目中 我一直在使用我在 venv 中设置的 python 解释器 最近我更改了我的 python 解释器 我在用户设置中将其设置为默认解释器 例如 vs 文档vs code python 环境 https code visualst
  • EXC_BAD_ACCESS 使用 IBInspectable

    我正在尝试使用IBInspectable为我的视图添加边框 extension UIView private func getBorder integer Int gt UIRectEdge if integer 1 return top
  • 在 forEach 之后发送响应

    请注意 这不是两个类似标题问题的重复 这两个问题使用 Mongoose 并且答案仅适用于 Mongoose 查询 我有一个目录列表 每个目录都包含一个文件 我想返回一个 JSON 列表 其中包含每个文件的内容 我可以毫无问题地加载文件 但是
  • Python 检查值是否在字典列表中

    我有一个字典列表 例如 name Bernard age 7 name George age 4 name Reginald age 6 我想检查字符串值是否与列表中任何字典中的 名称 值相同 例如 Harold 将为 False 但 Ge
  • XMPP:检索 BOSH 会话 ID 和 RID

    请告诉我如何检索 SID 和 JID 我正在使用 Strope JS var conn new Strophe Connection bosh service 然而 conn sid or conn rid没有返回相同的数字 经过这个和那个
  • 尝试获取字段值时出现属性错误

    我正在使用 django 休息框架 并且我尝试使用的序列化器正在创建错误 我正在尝试做类似的事情https gist github com anonymous 7463dce5b0bfcf9b6767 https gist github c
  • 在不耗尽 RAM 的情况下使用并发 Future

    我正在做一些文件解析 这是一个 CPU 密集型任务 无论我向该进程放入多少文件 它使用的 RAM 都不会超过 50MB 该任务是可并行的 我已将其设置为使用下面的并发 future 将每个文件解析为单独的进程 from concurrent