嵌套的for循环会占用内存,如何优化?

时间:2019-09-25 16:57:57

标签: python numpy optimization multiprocessing nested-loops

我有以下代码尝试使用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()

如您所见,这些列表产生了5亿个组合,因此嵌套的for循环中有5亿次迭代。

在执行计算时,Python似乎将计算所有组合并将这些组合保存到内存中(内存很快耗尽,每个CPU负载都在波动)。如果将总组合最小化到几百万,一切都会很好(内存使用率在某个时候稳定,所有CPU负载稳定在90%)。

如何优化代码?

1 个答案:

答案 0 :(得分:0)

感谢@ juanpa.arrivillaga,问题与注释中所述的完全相同。 Python尝试创建消耗所有内存的500M进程。

在注释之后,通过在循环中移动pool.close()pool.join(),解决方案很简单。

就我而言,我将其移动到for b in b_list:循环下,因为我有64G内存,在处理5M进程方面没有问题