我有以下代码尝试使用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%)。
如何优化代码?
答案 0 :(得分:0)
感谢@ juanpa.arrivillaga,问题与注释中所述的完全相同。 Python尝试创建消耗所有内存的500M进程。
在注释之后,通过在循环中移动pool.close()
和pool.join()
,解决方案很简单。
就我而言,我将其移动到for b in b_list:
循环下,因为我有64G内存,在处理5M进程方面没有问题