并行Python中的内存问题
我有这样一个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
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如何使用多重处理来做我想做的事情。但是,通过更改后端解决了内存问题,有关详细信息,请参阅我编辑的问题