我有一个像这样的Python脚本:
from modules import functions
a=1
parameters = par_vals
for i in range(large_number):
#do lots of stuff dependent on a, plot stuff, save plots as png
当我运行此值为“a”时,它需要半个小时,并且只使用我的6核心机器的1个核心。
我想为100个不同的“a”
值运行此代码问题是:如何将其并行化,以便我使用所有核心并尝试“a”的所有值?
根据在线建议,我的第一个方法是:
from joblib import Parallel, delayed
def repeat(a):
from modules import functions
parameters = par_vals
for i in range(large_number):
#do lots of stuff dependent on a, plot stuff, save plots as png
A=list_100_a #list of 100 different a values
Parallel(n_jobs=6,verbose=0)(delayed(repeat)(a) for a in A)
这成功地使用了计算机中的所有核心,但它同时计算了所有100个值。 4小时后,我的64GB RAM内存和64GB交换内存将饱和,性能急剧下降。 所以我试着在for循环中一次手动提示功能6次。但问题是内存也会消耗掉。
我不知道问题出在哪里。我想这个程序不知何故会保留不必要的内存。
我可以做什么,以便我没有这个记忆问题。
总结: 当我为特定值“a”运行此函数时,一切正常。 当我为6个“a”值并行运行此函数时,一切正常。 当我顺序运行此功能时,内存逐渐增加,直到计算机无法再运行。
更新:即使我不明白为什么,我找到了内存问题的解决方案。
似乎将matplotlib的后端更改为'Agg'不再产生内存问题。
只需在导入之前添加它,你应该没问题:
from matplotlib import use
use('Agg')
答案 0 :(得分:1)
以下是我如何使用multiprocessing
执行此操作。我将使用您的repeat
函数为a
的一个值完成工作。
def repeat(a):
from modules import functions
parameters = par_vals
for i in range(large_number):
#do lots of stuff dependent on a, plot stuff, save plots as png
然后我就像这样使用multiprocessing.pool
:
import multiprocessing
pool = multiprocessing.Pool(processes=6) # Create a pool with 6 workers.
A=list_100_a #list of 100 different a values
# Use the workers in the pool to call repeat on each value of a in A. We
# throw away the result of calling map, since it looks like the point of calling
# repeat(a) is for the side effects (files created, etc).
pool.map(repeat, A)
# Close the pool so no more jobs can be submitted to it, then wait for
# all workers to exit.
pool.close()
pool.join()
如果你想要调用repeat的结果,你可以result = pool.map(repeat, A)
。
我认为您不会遇到任何问题,但阅读programming guidelines使用multiprocessing
也很有用。