Python 3.x 如何使用Python-Ray并行处理大量数据而不占用内存?

Python 3.x 如何使用Python-Ray并行处理大量数据而不占用内存?,python-3.x,ray,Python 3.x,Ray,我正在考虑使用Ray实现数据并行处理的简单实现: 有大量的数据项需要处理,这些数据项通过流/迭代器变得可用。每件物品都有很大的尺寸 应在每个项目上运行一个函数,该函数将产生一个显著大小的结果 处理后的数据应该以流的形式传递,或者存储在某种接收器中,该接收器在一段时间内只能接受一定数量的数据 我想知道这是否可以在Ray中实现 目前,我有以下基于pythons多处理库的简单实现: 一个进程读取流并将项目传递到队列,该队列将在k个项目之后阻塞(以便队列所需的内存不会超过某个限制) 有几个工作进程

我正在考虑使用Ray实现数据并行处理的简单实现:

  • 有大量的数据项需要处理,这些数据项通过流/迭代器变得可用。每件物品都有很大的尺寸
  • 应在每个项目上运行一个函数,该函数将产生一个显著大小的结果
  • 处理后的数据应该以流的形式传递,或者存储在某种接收器中,该接收器在一段时间内只能接受一定数量的数据
我想知道这是否可以在Ray中实现

目前,我有以下基于pythons多处理库的简单实现:

  • 一个进程读取流并将项目传递到队列,该队列将在k个项目之后阻塞(以便队列所需的内存不会超过某个限制)
  • 有几个工作进程将从输入队列中读取并处理项目。处理后的项目被传递到结果队列,该队列的大小同样有限
  • 另一个进程读取结果队列以传递项目
这样,一旦工人无法处理更多的项目,队列就会阻塞,并且不会试图将更多的工作传递给工人。 如果接收器进程无法存储更多项,结果队列将阻塞,这将阻塞工作进程,工作进程将阻塞输入队列,直到写入进程可以再次写入更多结果


那么Ray有抽象来做这样的事情吗?我如何确保只有一定数量的工作可以传递给工作人员,我如何拥有类似于单进程输出函数的功能,并确保工作人员不能用太多的结果淹没该函数,从而耗尽内存/存储

有一个针对Ray的实验性流式API,您可能会发现它很有用:

它为流数据源、自定义运算符和接收器提供了基本结构。您还可以通过限制队列大小来设置应用程序的最大内存占用

你可以分享一些关于你的应用程序的附加信息吗


我们谈论的是什么类型的数据?单个数据项有多大(以字节为单位)

对于这个用例,我推荐Ray的。首先,您将制作一个生成器,它从流生成器(请参见)中获取大型对象,并对这些项目进行链操作(请参见)。关键的是,中间对象(它们本身可能很大)一旦被链中的下一个函数使用,就会从内存中退出,从而防止内存耗尽


最后,您可以控制队列上的执行,直到您的数据接收器准备好使用您想要的方法。

虽然这回答了问题,但底部的两行最好留作注释。一旦你赚够了钱,你就可以在其他用户的帖子上留下评论,从问题的海报上寻求澄清。