Вложенный для цикла съедает память, как оптимизировать? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть следующий код, пытающийся выполнить некоторые вычисления параллельно с использованием многопроцессорной обработки Python

import numpy as np
import multiprocessing

def prestart():
    ...

pool = multiprocessing.Pool(processes=cores)

a_list = np.linspace(0.01, 0.1, 10)
b_list = np.linspace(0.01, 0.25, 10)
c_list = np.linspace(0.7, 1, 5)
d_list = np.linspace(0.01, 10, 10)
e_list = np.linspace(0.1, 0.3, 10)
f_list = np.linspace(0.7, 1, 5)
g_list = np.linspace(0.2, 0.9, 20)
h_list = np.linspace(0.01, 10, 10)
i_list = np.linspace(0.75, 1, 10)

for a in a_list:
    for b in b_list:
        for c in c_list:
            for d in d_list:
                for e in e_list:
                    for f in f_list:
                        for g g_list:
                            for h in h_list:
                                for i in i_list:
                                    pool.apply_async(prestart, (a, b, c, d, e, f, g, h, i))

pool.close()
pool.join()

Как видите, эти списки дали 500 миллионов комбинаций и, следовательно, 500 миллионов итераций во вложенных циклах for.

Похоже, что Python вычислит все комбинации и сохранит эти комбинации в памяти, выполняя мои вычисления (память быстро израсходуется и каждая загрузка ЦП колеблется).Если я минимизирую общую комбинацию до нескольких миллионов, все прошло нормально (использование памяти в какой-то момент стабилизировалось, а загрузка всех процессоров - 90%).

Как я могу оптимизировать код?

1 Ответ

0 голосов
/ 25 сентября 2019

Спасибо @ juanpa.arrivillaga, проблема в точности та, что описана в комментарии.Python пытается создать 500M процессов, которые занимают всю память.

После комментария решение простое, переместив pool.close() и pool.join() в цикл for.

В моем случаеЯ перемещаю его по циклу for b in b_list:, так как у меня есть память 64G, которая не имеет проблем при обработке процессов 5M

...