并行Python中的内存问题

时间:2013-09-28 13:00:47

标签: python parallel-processing

我有一个像这样的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')

1 个答案:

答案 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也很有用。