В скрипте python 2.7 - первый многопроцессорный код для обработки большого куска массива numpy
. Это в основном блок кадров проекционных лучей между планом изображения и декартовой (мировой) плоскостью. Эта часть, называемая poo1
, работает нормально.
Далее в сценарии я пытаюсь воспроизвести многопроцессорный код для проецирования большого количества изображений с помощью этого блока кадров проекционных лучей.
Кажется, чтоРаботают только от 4 до 6 рабочих, но все они готовы к работе, заполняя их данными. pool2
создает рабочих, они медленно растут в использовании памяти, только 6 из них используют процессор.
Снимок экрана :
Примечания :
- Нет возврата для получения из мультиобработанной функции, выходной файл записывается в папку;
- Не беспокойтесь о проблемах с размером памяти, доступно половину ТБ;
- Не беспокойтесь о порядке процесса;
- Количество рабочих - это физическое ядро ЦП - 1 = 27;
- Длина списка распространяемых заданий (paramsGeoRef) может составлять от 1 до 250 строк.
Информация об аргументах :
- Frameclock, массивный ndarray, может быть GB
- A1: ndarray, может быть сотнями MB
- A2: ndarray, может быть сотнями MB
- B1: целочисленное значение
- B2: целочисленное значение
- fileName: строка, имя
- D1: строка, путь
- D2: строка, путь
- D3: строка,путь
- P1: маленький массив
- P2: маленький массив
Упрощение кода выглядит следующим образом :
def georef(paramsGeoRef):
#Pseudo workflow
"""
- unpack arguments, Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
- Loading tif image
- Evergy convertion
with function and P1, P2
- Proportional projection of the image
- Frameclock, A1, A2
- Evergy convertion
with function and P1, P2
- Figure creation
- Geotiff creation
- export into file figure, geotiff and numpy file
"""
return None
if __name__ == '__main__':
paramsGeoRef = []
for im in imgfiles:
paramsGeoRef.append([Frameclock, A1, A2, B1, B2, fileName, D1 , D2 , D3 , P1 , P2])
if flag_parallel:
cpus = multiprocessing.cpu_count()
cpus = cpus - 1
pool2 = multiprocessing.Pool(processes=cpus)
pool2.map(georef, paramsGeoRef)
pool2.close()
pool2.join()
Я пробовал разные подходы, такие как :
Распаковывать аргументы до:
def star_georef(Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2):
return georef(*paramsGeoRef)
def georef(paramsGeoRef):
#Pseudo workflow...
return None
Использовал другой тип карты:
pool2.imap_unordered()
Что не так? Почему этот метод работает для сжатия numpy
массива, но не для этой цели? Нужно обрабатывать куски?
Может быть, мне может потребоваться накормить рабочих, как только они станут доступны с генератором заданий?