Я написал алгоритм, который берет геопространственные данные и выполняет ряд шагов. Входные данные представляют собой файл формы полигонов и ковариационных растров для большой области изучения растра (~ 150 миллионов пикселей). Эти шаги заключаются в следующем:
- Пример точек из полигонов шейп файла
- Для каждой точки выборки извлекайте значения из ковариационных растров
- Построение прогнозной модели в точках выборки
- Извлечь ковариации для целевых точек сетки.
- Применить прогнозирующую модель к целевой сетке
- Запись предсказаний в набор выходных сеток
Весь процесс нужно повторять несколько раз (скажем, 100), но каждая итерация в настоящее время занимает больше часа, когда обрабатывается последовательно. Для каждой итерации наиболее трудоемкими частями являются шаги 4 и 5. Поскольку целевая сетка настолько велика, я обрабатывал ее как блок (например, 1000 строк) за раз.
У меня 6-ядерный процессор с 32 Гб оперативной памяти, поэтому на каждой итерации я решил использовать модуль Python multiprocessing
с объектом Pool
для обработки нескольких блоков одновременно (шаги 4 и 5) а затем записывать выходные данные (предсказания) в общий набор выходных сеток с помощью функции обратного вызова, которая вызывает глобальную функцию вывода на выходе. Кажется, что это работает, но не быстрее (на самом деле это, вероятно, медленнее), чем обработка каждого блока последовательно.
Итак, мой вопрос: есть ли более эффективный способ сделать это? Меня интересует многопроцессорный модуль Queue
, но я не уверен, как он работает. Например, мне интересно, если более эффективно иметь очередь, которая выполняет шаги 4 и 5, затем передает результаты в другую очередь, которая выполняет шаг 6. Или это даже то, для чего предназначена очередь?
Любые указатели будут оценены.