【发布时间】:2019-09-14 16:23:51
【问题描述】:
用例:
- 10 台服务器(16 核 128GB RAM)处理 20 亿个参数组合
- 每台服务器使用 pool.apply_async()(Python 3.7 版)处理 2 亿个组合
- 尽可能缩短总处理时间
问题:
- Python 耗尽所有内存并抛出错误“RuntimeError: can't start new thread”和“OSError: [Errno 12] Cannot allocate memory”
我正在考虑将 .apply_async() 方法替换为 .apply(),但我想通过更改非阻塞模式改为阻塞模式。
谁能帮助找到这种场景的最佳解决方案(花费最少的时间)?
我的代码:
exec_log = multiprocessing.Manager().list([0, ''])
lock = multiprocessing.Manager().Lock()
cores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=cores)
# Parameters a to j
for a in a_list: # a_list contains 2 elements
for b in b_list: # b_list contains 2 elements
for c in c_list: # c_list contains 5 elements
for d in d_list: # d_list contains 10 elements
for e in e_list: # e_list contains 10 elements
for f in f_list: # f_list contains 5 elements
for g in g_list: # g_list contains 20 elements
for h in h_list: # h_list contains 10 elements
for i in i_list: # i_list contains 10 elements
for j in j_list: # j_list contains 10 elements
pool.apply_async(prestart, (df, start_date, end_date, curr_date,
analysis_period, a, b, c, d, e,
f, g, h, i, j, exec_log, lock))
pool.close()
pool.join()
logger.info(exec_log[1])
【问题讨论】:
标签: python python-3.x parallel-processing multiprocessing python-multiprocessing