在高性能环境中的分叉工作进程之间共享状态

2023-12-03

这是我的后续行动上一个问题。正如 Tim Peters 所建议的,使用Manager可能不一定是最好的方法。不幸的是我有太多的脚手架代码来发布SSCCE。相反,我将尝试提供我的问题的详细解释。请随意浏览整个代码库Github,但现在有点混乱。

背景

我正在研究自然语言处理,我想做(类似的)基于字典的文档分类平滑。训练分类器将单词和短语与正确答案联系起来的想法。例如,包含单词的文档socialist很可能与政治有关,并且包含短语的内容lava temperature可能与地质有关。该系统通过查看少数预先标记的示例。由于语言多种多样,分类器永远不会“了解”它在生产中可能遇到的所有可能的短语。

这就是字典的用武之地。假设我们有一种便宜又简单的方法获得几乎所有短语的同义词(我会引用自己,因为它的品味很差)。当较差的分类器遇到它不知道的短语时,我们可以在字典中查找它并告诉分类器“看,你不知道communism,但这有点像socialist,你知道这一点!”。如果字典合理,分类器通常会表现得更好。

伪代码

data = Load training and testing documents (300MB on disk)
dictionary = Load dictionary (200MB - 2GB on disk) and place into a `dict` for fast look-ups
Repeat 25 times:
    do_work(data, dictionary)

def do_work(data, dictionary)
    X = Select a random sample of data
    Train a classifier on X
    Y = Select a random sample of data
    Using dictionary, classify all documents in Y
    Write results to disk

问题

上面的循环是并行化的完美候选者。我一直在使用Python 2.7multiprocessing.Pool(通过joblib.Parallel,因为它很简单,并且在出现问题时提供非常有用的回溯)。所有工作进程都需要对字典和文档集合进行只读访问。工作进程不需要相互通信,也不需要与父进程通信——它们所做的只是生成、执行一些魔法、写入文件然后死亡。

字典需要支持快速随机访问。我不知道样本是什么文件Y将包含,所以我不能轻易地修剪字典并只传递每个工人需要的部分。该字典将被经常查询 - 每次运行的典型命中次数为数百万。 目前,我的代码受内存限制,因为(我相信)正在为每个工作进程创建文档集合和字典的副本。解析时data and dictionary通常会消耗几 GB 的 RAM。我尝试过使用multiprocessing.managers.BaseManager以避免复制大型对象,但这会减慢工作人员的速度。

问题

还有哪些其他替代方案可以加快速度?我考虑过的事情包括:

  • MongoDB/CouchDB/memcached 应该可以很好地处理并发访问,但我担心吞吐量。在我之前的问题的评论中也建议了 Zeromq,但还没有机会研究它。
  • 在记忆中sqlite数据库和数据库连接不能跨进程共享,因此每个工作线程都需要自己的磁盘数据库连接。这意味着一开始会产生大量 I/O,并且随着每个工作进程的缓存增长,内存使用量也会很高。
  • 内存映射
  • 使用线程而不是进程

这个问题还表明许多现实世界的问题看起来需要只读访问dict可能会触发fork()是写时复制,因此可能无法完全避免复制大对象。


在您描述的场景中,在使用多线程时,您可能会因 GIL 而出现较大的性能问题。可能是为了避免您选择使用多重处理。另一方面,它使用进程,因此可能会为每个子进程复制数据结构。

我不想这么说,但使用非 Python 解决方案(例如 C++)可能会加快速度,因为在那里你不会遇到 GIL 问题。然后你可以使用多线程,不必复制东西等。从多个线程读取一个大字典并不是真正的问题,所以你不必同步任何东西(GIL总是会为你做的,没有一个真正的需要)。

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

在高性能环境中的分叉工作进程之间共享状态 的相关文章

随机推荐

  • 如何全屏滑动选定的网格图像

    我创建了一个网格视图图像应用程序 我想在图像滑动中显示所选图像 实际上我在我的应用程序中实现了图像滑动but问题是图像滑动从第一张图像开始 而不是从选定的图像开始 example 如果我选择第三张图像 则图像滑动应该从第三张图像开始 而不是
  • 缺少必需参数:aws_access_key_id、aws_secret_access_key

    我目前正在尝试在终端中运行我的测试套件 但出现以下错误 Missing required arguments aws access key id aws secret access key ArgumentError 我在我的项目中使用 C
  • Android HttpClient:NetworkOnMainThreadException

    我有下面的一些代码 protected void testConnection String url DefaultHttpClient httpclient new DefaultHttpClient HttpGet httpget ne
  • 用户帐户“root”的指定密码无效,或无法连接到数据库服务器

    我在 Windows Server 2012R2 上使用 Windows 平台安装程序 5 0 安装 WordPress 时遇到此错误 目前我在该服务器上有一个带有 mySQL 的 php 站点 运行良好 几个月前 作为设置该网站的一部分
  • 正则表达式将给定单词替换为两侧的空格或根本不替换

    我正在使用 PHP 中的一些代码 从搜索引擎获取引用数据 为我提供用户输入的查询 然后 我想从该字符串中删除某些停用词 如果存在 但是 该单词两端可能有也可能没有空格 例如 我一直使用 str replace 删除一个单词 如下所示 key
  • 绘制图像分类模型的混淆矩阵

    我用 keras 构建了一个图像分类 CNN 虽然模型本身运行良好 它可以正确预测新数据 但我在绘制模型的混淆矩阵和分类报告时遇到问题 我使用 ImageDataGenerator 训练了模型 train path DATASET TRAI
  • 我如何获取全局javascript变量中的ajax内容

    我想将内容放入javascript全局定义的变量中 我使用ajax调用获得的内容 http pastebin com TqiJx3PA 感谢您的任何建议 Pastebin 代码已经做到了这一点 我猜你实际面临的问题是存在的 因为你的 aja
  • 字符串格式为 yyyy-MM-dd HH:mm:ss Iphone

    我有一个 nsstring 见下文 NSString Mydate 9 8 2011 以月 日 年的格式 我希望这个字符串的格式yyyy MM dd HH mm ss 例如 2011 09 08 15 51 57 这样我需要以后面的格式在标
  • TensorFlow中重复训练和预测时如何避免OOM错误?

    我在 TensorFlow 中有一些代码 它采用一个基本模型 用一些数据对其进行微调 训练 然后使用该模型来predict 使用一些其他数据 所有这些都封装在一个main 模块的方法并且工作正常 然而 当我在不同的基本模型上循环运行此代码时
  • Bash 间接引用,其中一个 var 引用多个

    我试图取消引用单个变量中包含的两个或多个变量 但我不知道如何在没有 eval 的情况下执行此操作 b 5 c 10 a b c result eval echo a echo result 5 10 我希望执行相同的操作来给我 结果 这样我
  • 如何拦截window.location变化

    我需要一种方法将一些预处理附加到 window location 的每个分配 有没有办法做到这一点 我基本上需要序列化一些信息 这些信息将在新位置使用 您可以使用beforeunload事件触发您的代码在导航之前运行 如果您需要更具体的内容
  • ImportError: 在 windows7 32 位中运行 pip --version 命令时无法导入名称 main

    我已经安装了最新的 python 2 7 9 与 Windows 32 位的 pip 和 setuptools 捆绑在一起 我尝试重新安装 pip 但问题仍然存在 这是运行后的错误pip version在管理员cmd中 Traceback
  • 更改 UITextField 的默认触摸事件

    好吧 这就是我想做的 我有一个 UITextField 当我单击它时 我想调用我的方法之一 当我双击 用 1 根手指点击两次 它时 我想编辑文本字段 就像我在普通的 UITextField 上单击它一样 我不知道该怎么做 我正在考虑对 UI
  • C# - (int)Math.Round((double)(3514 + 3515)/2) =3514?

    大家好 int ai1 new int 2 3514 3515 void average1 List
  • Hibernate JPA 不支持@TableGenerator 的“initialValue”元素吗?

    TableGenerator name Emp Gen table ID GEN pkColumnName GEN NAME pkColumnValue Employee GEN valueColumnName GEN VAL initia
  • 从 Laravel 9 中的存储外观获取 S3Client

    我正在尝试将 S3 Multipart Uploader 从 Laravel 8 升级到 Laravel 9 并已按照文档中的概述升级到 Flysystem 3 并且没有依赖项错误https laravel com docs 9 x upg
  • 如何将AIRPLANE_MODE_ON设置为“True”或ON?

    我打算挂断电话 我发现这是解决该问题的方法之一 如何通过代码激活飞行模式 这样我就会根据某些事件挂断电话 请参阅博客文章Android 控制飞行模式 仅适用于API 16 Toggle airplane mode Settings Syst
  • java Android - 以编程方式处理图像缩放/裁剪

    好吧 所有这些事情折磨了我好几个星期 我将图像设置为 227 像素高 然后将其缩放到 170 像素 即使我每次都希望它是wrapp content 好的 在这里 我拍摄了 1950 像素长的 我的图像 我将其中的一部分放在这里 以便您可以了
  • Symfony CollectionType 更新实体

    我不敢相信其他人没有遇到这种情况 但我无法找到解决方案 假设我有两个实体类型 A 和 B 具有一对多关系 A 有 B 的集合 A 的形式有一个CollectionType对于B 有一个定制的entry type for B allow ad
  • 在高性能环境中的分叉工作进程之间共享状态

    这是我的后续行动上一个问题 正如 Tim Peters 所建议的 使用Manager可能不一定是最好的方法 不幸的是我有太多的脚手架代码来发布SSCCE 相反 我将尝试提供我的问题的详细解释 请随意浏览整个代码库Github 但现在有点混乱