并行Python中的内存问题

并行Python中的内存问题,python,parallel-processing,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 import multiprocessing pool = multiprocessing.Pool(processes=6) # Create a po

我有这样一个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
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()
当我运行这个值为“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')

下面是我如何使用
多处理
。我将使用您的
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
然后我会像这样使用
多处理.pool

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
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)


我认为您不会遇到任何问题,但是阅读关于使用
多处理

python 2.7.4和ipython 1.0的手册也很有用。您是否尝试在ipython之外运行此工具?我还建议转储
joblib
并直接使用
multiprocessing
。不,我现在就试试。我希望我了解如何在多处理上做到这一点。我找不到适合我的例子needs@NunoCalaim你知道在那之前它使用的是什么后端吗?是的,默认情况下它使用“TkAgg”,这会是一个问题吗?我会测试这个,然后回答!ThanksIt起作用了,但也有同样的记忆问题。我会接受你的答案,因为它教会了e如何使用多重处理来做我想做的事情。但是,通过更改后端解决了内存问题,有关详细信息,请参阅我编辑的问题