Я рассматриваю возможность использования Ray для простой реализации параллельной обработки данных:
- существует огромное количество элементов данных для обработки, которые становятся доступными через поток / итератор. Каждый предмет имеет значительный размер
- функция должна быть запущена для каждого из элементов и даст результат значительного размера
- обработанные данные должны быть переданы в потоке или сохранены в каком-либо приемнике, который может принимать только определенное количество данных в течение определенного периода времени
Я хочу выяснить, можно ли это сделать в Рее.
В настоящее время у меня есть следующая простая реализация, основанная на многопроцессорной библиотеке pythons:
- один процесс читает поток и передает элементы в очередь, которая будет блокироваться после k элементов (чтобы объем памяти, необходимый для очереди, не превышал некоторый предел)
- есть несколько рабочих процессов, которые будут читать из входной очереди и обрабатывать элементы. Обработанные элементы передаются в очередь результатов, которая снова имеет ограниченный размер
- другой процесс читает очередь результатов для передачи элементов
При этом, как только рабочие не смогут обрабатывать больше элементов, очередь блокируется, и не делается никаких попыток передать рабочим больше работы.
Если процесс приемника не может сохранить больше элементов, очередь результатов блокируется, что, в свою очередь, блокирует рабочих, которые в свою очередь блокируют входную очередь, пока процесс записи не сможет снова записать больше результатов.
Так у Рэя есть абстракции, чтобы сделать что-то подобное? Как бы я мог убедиться, что только определенный объем работы может быть передан рабочим, и как я могу иметь что-то вроде однопроцессной функции вывода и убедиться, что рабочие не могут залить эту функцию с таким большим количеством результатов, что память / хранилище исчерпано?