Как реализовать распределенную обработку многих больших элементов данных в Python? - PullRequest
0 голосов
/ 08 мая 2019

Существует множество библиотек Python для многопроцессорной обработки, асинхронного отображения, распределенных вычислений, удаленного вызова объектов и т. Д. Но, насколько я понимаю, большинство из них, похоже, предназначены для высокопроизводительной обработки, где каждый отдельный вызов занимает только короткое время. чтобы добиться успеха и обрабатывает только небольшое количество данных.

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

Рабочие получат огромное количество довольно больших фрагментов данных из некоторого источника.

Проблема, с которой я сталкиваюсь, заключается в том, что источник хочет «запихнуть» как можно больше данных в очередь для обработки их работниками. Рабочие, в свою очередь, помещают данные в очередь для окончательного процесса сохранения. Но если нет какого-либо способа ограничить объем данных, помещаемых источником в очередь, ресурс для очереди (память) будет быстро израсходован. С другой стороны, мы также не хотим ограничивать ставку, чтобы работники остались без работы.

Практически все примеры во всех библиотеках, которые я просматривал (Ray, Pathos и другие), демонстрируют хороший синтаксис для запуска какой-либо функции или объекта на другом компьютере или в другом процессе, а затем показывают, как выполнять асинхронное отображение с использованием этого процесса. или пул процессов. Но все эти примеры, по-видимому, неявно отправляют все данные рабочим, что не является проблемой в коде примера, потому что данные крошечные и легко помещаются в память. Но в моем случае даже доля не уместилась в память.

Как правильно решить эту проблему? Моя единственная идея состоит в том, чтобы потребовать реализацию очереди, которая может быть ограничена по размеру, но ни одна из библиотек, на которую я смотрел, кажется, не обеспечивает этого, и я не смог найти никакой реализации такой очереди для распределенной обработки (между несколькими компьютерами). Так что идея использовать очередь ограниченного размера неправильна, и правильный способ сделать это - что-то другое?

...