Как обрабатывать большие объемы данных параллельно, не используя память с Python Ray? - PullRequest
3 голосов
/ 07 мая 2019

Я рассматриваю возможность использования Ray для простой реализации параллельной обработки данных:

  • существует огромное количество элементов данных для обработки, которые становятся доступными через поток / итератор. Каждый предмет имеет значительный размер
  • функция должна быть запущена для каждого из элементов и даст результат значительного размера
  • обработанные данные должны быть переданы в потоке или сохранены в каком-либо приемнике, который может принимать только определенное количество данных в течение определенного периода времени

Я хочу выяснить, можно ли это сделать в Рее.

В настоящее время у меня есть следующая простая реализация, основанная на многопроцессорной библиотеке pythons:

  • один процесс читает поток и передает элементы в очередь, которая будет блокироваться после k элементов (чтобы объем памяти, необходимый для очереди, не превышал некоторый предел)
  • есть несколько рабочих процессов, которые будут читать из входной очереди и обрабатывать элементы. Обработанные элементы передаются в очередь результатов, которая снова имеет ограниченный размер
  • другой процесс читает очередь результатов для передачи элементов

При этом, как только рабочие не смогут обрабатывать больше элементов, очередь блокируется, и не делается никаких попыток передать рабочим больше работы. Если процесс приемника не может сохранить больше элементов, очередь результатов блокируется, что, в свою очередь, блокирует рабочих, которые в свою очередь блокируют входную очередь, пока процесс записи не сможет снова записать больше результатов.

Так у Рэя есть абстракции, чтобы сделать что-то подобное? Как бы я мог убедиться, что только определенный объем работы может быть передан рабочим, и как я могу иметь что-то вроде однопроцессной функции вывода и убедиться, что рабочие не могут залить эту функцию с таким большим количеством результатов, что память / хранилище исчерпано?

1 Ответ

3 голосов
/ 09 мая 2019

Существует экспериментальный потоковый API для Ray, который может оказаться полезным: https://github.com/ray-project/ray/tree/master/python/ray/experimental/streaming

Предоставляет базовые конструкции для потоковых источников данных, пользовательских операторов и приемников. Вы также можете установить максимальный объем памяти для своего приложения, ограничив размеры очереди.

Можете ли вы поделиться дополнительной информацией о вашем приложении?

О каких типах данных мы говорим? Насколько велик один элемент данных в байтах?

...