python-3.x - 如何使用 Python Ray 在不耗尽内存的情况下并行处理大量数据?
问题描述
我正在考虑使用 Ray 来简单地实现数据的并行处理:
- 有大量需要处理的数据项可以通过流/迭代器获得。每件物品的尺寸都很大
- 应该在每个项目上运行一个函数,并将产生一个很大的结果
- 处理后的数据应该在流中传递或存储在某种接收器中,该接收器只能在一段时间内接受一定数量的数据
我想知道这是否可以在 Ray 中完成。
目前我有以下基于pythons多处理库的简单实现:
- 一个进程读取流并将项目传递给队列,该队列将在 k 个项目后阻塞(这样队列所需的内存不会超过某个限制)
- 有几个工作进程将从输入队列中读取并处理项目。已处理的项目被传递到结果队列,该队列的大小再次受到限制
- 另一个进程读取结果队列以传递项目
这样一来,一旦工作人员无法处理更多项目,队列就会阻塞,并且不会尝试将更多工作传递给工作人员。如果 sink 进程无法存储更多的项目,结果队列将阻塞,这反过来又会阻塞 worker,而 worker 又会阻塞输入队列,直到 writer 进程可以再次写入更多结果。
那么Ray 有抽象来做这样的事情吗?我如何确保只能将一定数量的工作传递给工作人员,我如何才能拥有像单进程输出函数这样的东西,并确保工作人员不能用如此多的结果淹没该函数,以至于内存/存储已用完?
解决方案
有一个适用于 Ray 的实验性流 API,您可能会发现它很有用:https ://github.com/ray-project/ray/tree/master/python/ray/experimental/streaming
它为流数据源、自定义运算符和接收器提供了基本结构。您还可以通过限制队列大小来为您的应用程序设置最大内存占用。
您能否分享一些有关您的应用程序的其他信息?
我们在谈论什么类型的数据?单个数据项有多大(以字节为单位)?
推荐阅读
- c - 涉及到DPDK流程的IPC怎么做?
- javascript - 在反应中实现的 Openlayers 地图在移动设备上不起作用
- python-3.x - 从多对多相关模型中获取特定字段的键值对,不重复
- react-native - React native appstate 用于检查用户在线和离线
- excel - 满足某些条件时删除工作表
- c# - WebRequest NET Core 3.1 中的自定义标头
- swift - NSTextList 格式化
- matlab - 在 Matlab 的表格中使用 \pm Latex 符号
- java - 如何使用 Intent 以字节数组形式可视化文件?
- python - Django Rest Framework如何在models.CharField上设置error_messages