Эффективное использование subprocess.call с многопроцессорным пулом - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время я использую сценарий python в пакетной системе LSF для параллельного выполнения некоторой обработки с использованием внешнего программного обеспечения Java, которое вызывается через пакетный сценарий. К сожалению, вся обработка настолько сложна, что я не могу привести воспроизводимый пример.

Мой способ сделать это состоит в следующем:

Для каждого ввода я генерирую правильную команду линия inputs = ["./processing"+input for input in list_of_files]. Eah c обработки файлов generateosme, но ничего не возвращается.

Затем для его распараллеливания я использую multicore и subprocess.call следующим образом:

def run_cl(cl):
   subprocess.call(cl,shell=True)

и для запуска кода в параллельно я использую следующую настройку:

with mp.Pool(self.max_jobs) as pool:
     results = pool.starmap(run_cl, inputs)

Я запускаю это на кластере nan LSF. Однако чем больше я увеличиваю количество ядер, тем больше мне требуется памяти для каждого ядра, а это значит, что я могу запустить его с 40 ядрами и 1 Гбит на ядрах (задача - сложное вычисление, занимающее 10 минут на ядре 1 Гб), но если Я стараюсь набрать sh до 100 ядер, работа будет убита, потому что 1 Гб больше не достаточно. К сожалению, я не могу просто продолжать выделять больше памяти для ядра.

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

  • Это ожидаемое поведение? Если да, может кто-нибудь объяснить механизм?
  • Как уменьшить использование памяти первого процесса, который порождает все остальные?
  • Есть ли лучший способ сделать это в python?

Бест, Алексис

...