Многопроцессорный пул - большинство рабочих загружены, но все еще простаивают - PullRequest
0 голосов
/ 04 октября 2019

В скрипте python 2.7 - первый многопроцессорный код для обработки большого куска массива numpy. Это в основном блок кадров проекционных лучей между планом изображения и декартовой (мировой) плоскостью. Эта часть, называемая poo1, работает нормально.

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

Кажется, чтоРаботают только от 4 до 6 рабочих, но все они готовы к работе, заполняя их данными. pool2 создает рабочих, они медленно растут в использовании памяти, только 6 из них используют процессор.

Снимок экрана : Workers that do not work during multiprocessing

Примечания :

  • Нет возврата для получения из мультиобработанной функции, выходной файл записывается в папку;
  • Не беспокойтесь о проблемах с размером памяти, доступно половину ТБ;
  • Не беспокойтесь о порядке процесса;
  • Количество рабочих - это физическое ядро ​​ЦП - 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 массива, но не для этой цели? Нужно обрабатывать куски?

Может быть, мне может потребоваться накормить рабочих, как только они станут доступны с генератором заданий?

1 Ответ

0 голосов
/ 09 октября 2019

Следуя совету Мартино,

Я сохраняю аргументы Frameclock, A1 и A2 с помощью numpy в формате .npy. Затем я загружаю .npy внутри распараллеленного.

, таких как:

def georef(paramsGeoRef):

    #Pseudo workflow
    """
    - unpack arguments, Frameblock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
    - load Frameblock from his .npy
    - load A1 from his .npy
    - load A2 from his .npy
    - 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

Даже при сохранении и загрузке это значительно увеличивает эффективность! Все рабочие работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...