Производительность постепенно снижается при работе Python многопроцессорных - PullRequest
0 голосов
/ 14 апреля 2020

Я использую сложный метод python (один запуск занял 3-5 минут) в нескольких случаях с использованием multiprocess. Я заметил, что скорость работы нормальная, когда я впервые запустил программу: я могу получить около 20-30 выходов за 5 минут, используя 30 ядер, однако со временем производительность постепенно снижается, например, в какой-то момент, Я могу получить только 5 выходов за 30 минут. Затем я убиваю программу и перезапускаю ее, затем она следует тому же поведению. В чем может быть причина? Это из-за накладных расходов? Что я могу сделать? Ниже приведен пример кода параллельной программы: я читаю соленья (экземпляр класса) в коде

import multiprocess as mp
import os
import pickle

def run_all_cases(input_folder):
    pickle_files = [x for x in os.listdir(input_folder)]
    jobs = [(file, input_folder) for file in pickle_files]
    num_process = max(mp.cpu_count()-1, 1)
    with mp.Pool(processes=num_process) as pool:
        pool.starmap(run_single_case, jobs)

def run_single_case(file_name, input_folder):
    print(f"started {file} using {os.getpid()}")
    data = pickle.load(input_folder + file_name)
    # a complicated method in a class 
    data.run_some_method()
    pickle.dump(data, f"{file_name.split("_")[0]}_output.pkl")
    print(f"finished {file} using {os.getpid()}")


Кроме того, когда я распечатываю идентификатор процесса, он со временем меняется. Это ожидается (запустил file_8, используя новый идентификатор процесса)? Вывод выглядит примерно так (если используется 5 ядер):

started file_1 using core 8001
started file_2 using core 8002
started file_3 using core 8003
started file_4 using core 8004
started file_5 using core 8005
finished file_1 using core 8001
started file_6 using core 8001
finished file_2 using core 8002
started file_7 using core 8002
started file_8 using core 8006 #<-- it starts a new process id, rather than using the existing ones, is this expected?
finished file_3 using core 8003
...

============================ ====

ОБНОВЛЕНИЯ: Я углубляюсь в некоторые случаи, когда процесс не работает после их обработки. Когда я запускаю один экземпляр, через некоторое время в терминале он говорит:

zsh: killed     python3 test.py

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

1 Ответ

0 голосов
/ 14 апреля 2020

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

...