Архитектура многопроцессорной обработки Python

Я написал алгоритм, который берет геопространственные данные и выполняет ряд шагов.Входные данные представляют собой шейп-файл полигонов и ковариантных растров для большой области растрового исследования (~150 миллионов пикселей). Шаги следующие:

  1. Выборка точек из полигонов шейп-файла
  2. Для каждой точки выборки извлечение значений из растров ковариатных
  3. Построение прогнозной модели на точках выборки
  4. Извлечение ковариат для целевой сетки точек
  5. Применение модели прогнозирования к целевой сетке
  6. Запись прогнозов в набор выходных сеток

Весь процесс необходимо повторять несколько раз (скажем, 100), но каждая итерация в настоящее время занимает более часа при обработке последовательно. Для каждой итерации больше всего времени занимают этапы 4 и 5. Поскольку целевая сетка очень большая, я обрабатывал ее блоками (скажем, 1000 строк) за раз.

У меня 6-ядерный ЦП с 32 Гб ОЗУ, поэтому на каждой итерации я пытался использовать модуль Python multiprocessingс объектом Poolдля обработки ряда блокирует одновременно (шаги 4 и 5), а затем записывает вывод (прогнозы) в общий набор выходных сеток, используя функцию обратного вызова, которая вызывает глобальную функцию записи вывода. Кажется, это работает, но не быстрее (на самом деле, вероятно, медленнее), чем последовательная обработка каждого блока.

Итак, мой вопрос: есть ли более эффективный способ сделать это? Меня интересует класс Queueмодуля multiprocessing, но я не очень понимаю, как он работает. Например, мне интересно, эффективнее ли иметь очередь, выполняющую шаги 4 и 5, а затем передавать результаты в другую очередь, выполняющую шаг 6.Или это даже то, для чего нужна очередь?

Будем признательны за любые указатели.

18
задан hendra 1 June 2012 в 01:12
поделиться