如何在 ipyparallel 客户端和远程引擎之间最好地共享静态数据?

2024-04-12

我在具有不同参数的循环中运行相同的模拟。每个模拟都使用 pandas DataFrame (data) 只能读取,不能修改。使用ipyparallel(IPython并行),我可以在模拟开始之前将此DataFrame放入我视图中每个引擎的全局变量空间中:

view['data'] = data

然后,引擎可以访问 DataFrame 以进行在其上运行的所有模拟。复制数据的过程(如果是 pickled,data是 40MB) 只需几秒钟。然而,如果模拟数量增加,内存使用量就会变得非常大。我想这个共享数据正在被复制对于每个任务而不仅仅是对于每个引擎。与引擎共享客户端静态只读数据的最佳实践是什么?每个引擎复制一次是可以接受的,但理想情况下每个主机只需复制一次(我在主机 1 上有 4 个引擎,在主机 2 上有 8 个引擎)。

这是我的代码:

from ipyparallel import Client
import pandas as pd

rc = Client()
view = rc[:]  # use all engines
view.scatter('id', rc.ids, flatten=True)  # So we can track which engine performed what task

def do_simulation(tweaks):
    """ Run simulation with specified tweaks """
    #  Do sim stuff using the global data DataFrame
    return results, id, tweaks

if __name__ == '__main__':
    data = pd.read_sql("SELECT * FROM my_table", engine)
    threads = []  # store list of tweaks dicts
    for i in range(4):
        for j in range(5):
            for k in range(6):
                threads.append(dict(i=i, j=j, k=k)

    # Set up globals for each engine.  This is the read-only DataFrame
    view['data'] = data
    ar = view.map_async(do_simulation, threads)

    # Our async results should pop up over time.  Let's measure our progress:
    for idx, (results, id, tweaks) in enumerate(ar):
        print 'Progress: {}%: Simulation {} finished on engine {}'.format(100.0 * ar.progress / len(ar), idx, id)
        # Store results as a pickle for the future
        pfile = '{}_{}_{}.pickle'.format(tweaks['i'], tweaks['j'], tweaks['j'])
        # Save our results to a pickle file
        pd.to_pickle(results, out_file_path + pfile)

    print 'Total execution time: {} (serial time: {})'.format(ar.wall_time, ar.serial_time)

如果模拟计数很小(~50),那么需要一段时间才能开始,但我开始看到进度打印语句。奇怪的是,多个任务将被分配给同一个引擎,并且在该引擎的所有分配的任务完成之前我看不到响应。我希望看到来自enumerate(ar)每次单个模拟任务完成时。

如果模拟计数很大(~1000),则需要很长时间才能开始,我看到所有引擎上的 CPU 都在加速,但直到很长一段时间(~40 分钟)才看到进度打印语句,当我do查看进度,似乎有一大块(>100)任务进入了同一个引擎,并等待该引擎完成,然后才提供一些进度。当那台发动机完成后,我看到了ar对象每 4 秒提供新响应 - 这可能是写入输出 pickle 文件的时间延迟。

最后,host1 还运行 ipycontroller 任务,并且它的内存使用量疯狂增加(Python 任务显示使用 >6GB RAM,内核任务显示使用 3GB)。 host2 引擎根本没有显示太多内存使用情况。什么会导致内存激增?


几年前我在代码中使用了这个逻辑,并且我开始使用this http://ipyparallel.readthedocs.io/en/latest/multiengine.html?highlight=sync_imports#moving-python-objects-around。我的代码是这样的:

shared_dict = {
    # big dict with ~10k keys, each with a list of dicts
}

balancer = engines.load_balanced_view()

with engines[:].sync_imports(): # your 'view' variable 
    import pandas as pd
    import ujson as json

engines[:].push(shared_dict)

results = balancer.map(lambda i: (i, my_func(i)), id)
results_data = results.get()

如果模拟计数很小(~50),那么需要一段时间才能得到 开始了,但我开始看到进度打印语句。奇怪的是, 多个任务将被分配给同一个引擎,但我没有看到 响应,直到完成所有分配的任务 引擎。我希望每次都能看到 enumerate(ar) 的响应 单个模拟任务完成。

就我而言,my_func()这是一种复杂的方法,我将大量日志消息写入文件中,因此我有了打印语句。

关于任务分配,正如我所使用的load_balanced_view(),我离开图书馆找到了路,而且效果很好。

如果模拟次数很大(~1000),则需要很长时间才能得到 开始时,我看到所有引擎上的 CPU 都在加速,但没有任何进展 print 语句会被看到很长时间(~40 分钟),当我这样做时 查看进度,似乎有一大块(>100)任务转到了相同的任务 引擎,并在提供之前等待该引擎完成 一些进展。当那个引擎完成时,我看到了 ar 对象 每 4 秒提供新的响应 - 这可能是时间延迟 写入输出 pickle 文件。

很长一段时间以来,我都没有经历过,所以我不能说什么。

我希望这可以解决您的问题。


PS:正如我在评论中所说,你可以尝试多处理池 https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.pool.Pool。我想我还没有尝试使用它来共享大的只读数据作为全局变量。我会尝试一下,因为似乎有效 https://kaushikghose.wordpress.com/tag/python.

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

如何在 ipyparallel 客户端和远程引擎之间最好地共享静态数据? 的相关文章

随机推荐

  • 如何创建播放列表

    我正在尝试创建一个仅提供编辑文本和图像按钮的应用程序 如果单击按钮 则会将专辑添加到播放列表中 并在编辑文本框中命名 专辑应随机选择 不用说 专辑曲目应该按正确的顺序排列 我可以稍后添加更多功能 例如 保存 覆盖 删除等 我有界面 但正在努
  • Magento 1.9 注册后重定向客户

    我想在 Magento 1 9 中成功注册后将所有客户重定向到自定义页面 我已经尝试了很多事情 首先 我成功地覆盖了核心客户帐户控制器 我尝试自定义以下操作 创建后动作 successProcessRegistration welcome客
  • 在 C# 中实现动态 Web Scraper 的逻辑

    我希望在 C 窗口窗体中开发一个 Web scraper 我想要完成的任务如下 从用户处获取 URL 在WINForms中的IE UI控件 嵌入式浏览器 中加载网页 允许用户选择文本 连续 小 不超过 50 个字符 从加载的网页 当用户希望
  • 第三个克隆海龟

    我在尝试制作追逐游戏时制作了这个程序 但我偶然发现了一些非常奇怪的东西 我创建了海龟的克隆体 但在地图中间出现了第三个 有谁知道是什么原因造成的 import turtle sc turtle Screen t turtle Turtle
  • Java加密AES,PHP解密AES

    我正在寻找一种在 Java 中加密字符串并在 PHP 中解密的方法 我发现this http www logikdev com 2010 11 01 encrypt with php decrypt with java 在 Stackove
  • 阻止 Google Analytics 在开发环境、ASP.NET MVC 中收集数据

    我有一个 ASP NET MVC 3 应用程序 并且我已经设置了 Google 分析 问题是 每次我从 Visual Studio 运行时 Google 脚本都会开始收集数据 这当然会扭曲实际结果 阻止 Google Analytics 收
  • 本机客户端上用于 SMTP 的 Office 365 XOAUTH2 535 5.7.3 身份验证失败

    我尝试通过office 365的smtp发送邮件 我在azure中为本机客户端设置了应用程序注册并设置了权限SMTP Send 但是当我连接时 我已经能够获得令牌 但发送不起作用 在我阅读的所有其他文章中 我需要设置 https outlo
  • 无法创建类型的常量值在此上下文中仅支持基本类型或枚举类型

    我在下面的查询中收到此错误 无法创建类型的常量值API Models PersonProtocol 此上下文中仅支持基本类型或枚举类型 ppCombined下面是一个IEnumerable的对象PersonProtocolType 由 2
  • Firebase 身份验证 - 开源 Android 应用

    有没有办法Firebase 身份验证 https firebase google com docs auth gclid EAIaIQobChMIhKuIo zV4wIVhRx9Ch1VwAh7EAAYASAAEgLRrvD BwE在开源应
  • SQLAlchemy 查询 API 在提示下无法正常工作

    我正在尝试使用查询 API 创建带有 MAX EXECUTION TIME 30000 提示的 MySQL 查询 我的代码大致是 from flask sqlalchemy import SQLAlchemy class MyTable S
  • 为什么我可以转换为 NSManagedObject 但不能转换为我的实体的类型?

    我在一个新项目中使用 Core Data 的 Swift 样板代码 我的 xcdatamodeld文件定义了一个实体 Task 具有单个属性 name 我有一个Task swift文件看起来像这样 import CoreData class
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • CSS:如何使盒子内部的角变圆? [复制]

    这个问题在这里已经有答案了 有border radius属性为圆形框角 但是如何在块内圆角 例如减去圆 像这儿 http malsup com jquery corner http malsup com jquery corner 卷曲设置
  • preg_match_all() 在不同的服务器上表现不同

    下面的代码在我的 PC 上的 XAMPP 上运行完美 但在我新购买的 VPS 上不起作用 它使我的代码崩溃了 preg match all regex siU string matches PREG SET ORDER 这预计只是从 HTM
  • 如何从 Android 中的自定义 CameraView 捕获图像?

    我需要捕捉图像 from 所需部分 of the screen 捕捉图像 from camera 当时其他屏幕内容保持原样 这怎么样possible 尝试使用表面视图 for 创造动态 camera查看并设置您需要的部分 下面的代码尝试 变
  • 从 pthread 调用 sleep() 是否会使线程或进程进入睡眠状态?

    我看到有一个关于linux pthread睡眠 https stackoverflow com questions 3633089 pthread sleep linux 然而 当我在 Linux 机器上查找手册页时 我看到以下内容 概要
  • 在 Mac OS X 的 Swing 应用程序中嵌入 JRE

    我必须发布带有嵌入式 JRE 的 swing 应用程序 包含应用程序 JRE bat sh 的压缩存档可以在 Windows 和 Linux 上实现 用户下载 zip 文件 解压缩并启动应用程序 完美的 但现在 我必须为 Mac OS X
  • Angular 7 组件测试使用原始服务而不是模拟服务

    我正在尝试测试具有注入服务的组件 我想在我的测试中提供模拟服务 然而 测试使用原始服务而不是模拟服务 我知道这一点是因为我收到 没有 HttpClient 的提供程序 错误 而且我在测试中输出的原始服务中有一个 console log 我可
  • 委托不接受子类?

    我的委托似乎不接受子类 我认为一个例子是最简单的 public class A public A public class B A public B public class Program private delegate void Ca
  • 如何在 ipyparallel 客户端和远程引擎之间最好地共享静态数据?

    我在具有不同参数的循环中运行相同的模拟 每个模拟都使用 pandas DataFrame data 只能读取 不能修改 使用ipyparallel IPython并行 我可以在模拟开始之前将此DataFrame放入我视图中每个引擎的全局变量