gpt4 book ai didi

python - 在高性能环境中的 fork 工作进程之间共享状态

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:40 27 4
gpt4 key购买 nike

这是我的 previous question 的跟进.正如 Tim Peters 所建议的那样,使用 Manager 可能不一定是最好的方法。不幸的是,我有太多脚手架代码无法发布 SSCCE .相反,我将尝试提供对我的问题的详细解释。请随时在 Github 上浏览整个代码库。 , 但现在有点乱。

背景

我正在研究自然语言处理,我想为文档分类做(类似的)基于字典的平滑处理。训练分类器将单词和短语与正确答案相关联的想法。例如,包含单词 socialist 的文档可能与政治有关,而包含短语 lava temperature 的文档可能与地质学有关。该系统通过查看少量预先标记的示例进行训练。因为语言是如此多样,分类器永远不会“知道”它在生产中可能遇到的所有可能的短语。

这就是字典的用武之地。假设我们有 a cheap and easy way获得几乎所有短语的同义词(我会引用自己,因为它的品味很差)。当可怜的分类器遇到它不知道的短语时,我们可以在所述字典中查找它并告诉分类器“看,你不知道共产主义,但它有点像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.7 multiprocessing.Pool(通过 joblib.Parallel,因为它很简单,并且在事情进展顺利时提供非常有用的回溯)。所有工作进程都需要对字典和文档集合进行只读访问。 worker 无需相互通信或与父进程通信 - 他们所做的只是生成、施展魔法、写入文件然后死去。

字典需要支持快速随机访问。我不知道示例 Y 将包含哪些文档,因此我无法轻松地修剪字典并仅将其中需要的部分传递给每个工作人员。字典将经常被查询——典型的每次运行命中数以百万计。目前我的代码是内存绑定(bind)的,因为(我相信)正在为每个工作进程制作文档集合和字典的副本。解析 datadictionary 通常会占用几 GB 的 RAM。我已经尝试使用 multiprocessing.managers.BaseManager 来避免复制大对象,但这会减慢工作人员的速度。

问题

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

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

This SO question还建议许多看起来需要对 dict 进行只读访问的现实世界问题可能会触发 fork() 的写时复制,因此它可能不可能完全避免复制大型对象。

最佳答案

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

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

关于python - 在高性能环境中的 fork 工作进程之间共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20971191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com