我有一个这样的 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)
这成功地使用了我在计算机中的所有内核,但它同时计算了 a 的所有 100 个值。4 小时后,我的 64GB RAM 内存和 64GB 交换内存将饱和,性能急剧下降。因此,我尝试在 for 循环中手动提示该函数一次执行 6 次。但问题是内存也会被消耗。
我不知道问题出在哪里。我猜想该程序以某种方式保留了不必要的内存。
我该怎么做才能没有这个记忆问题。
总之:当我为“a”的特定值运行此函数时,一切正常。当我为 6 个“a”值并行运行此函数时,一切正常。当我按顺序并行运行此功能时,内存逐渐增加,直到计算机无法再工作。
更新:即使我不明白为什么,我也找到了内存问题的解决方案。
似乎将 matplotlib 的后端更改为“Agg”不再产生内存问题。
只需在任何导入之前添加它就可以了:
from matplotlib import use
use('Agg')