0

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

1 回答 1

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

我认为您不会遇到任何问题,但阅读使用multiprocessing.

于 2013-09-28T15:04:12.573 回答