我在下面有一个Python函数示例,它只是简单地接受一个变量并在返回之前对其执行简单的数学运算。
如果我并行化这个函数,为了更好地反映我想在现实生活中执行的操作,并运行并行化函数 10 次,我注意到在我的 IDE 上,尽管使用了del results
行,内存还是增加了。
import multiprocessing as mp
import numpy as np
from tqdm import tqdm
def function(x):
return x*2
test_array = np.arange(0,1e4,1)
for i in range(10):
pool = mp.Pool(processes=4)
results = list(tqdm(pool.imap(function,test_array),total=len(test_array)))
results = [x for x in results if str(x) != 'nan']
del results
我有几个问题,希望知道以下问题的答案:
- 有没有办法防止这种内存增加?
- 此内存加载是否由于并行化过程?
我还没有尝试过,但我很确定你不需要定义
pool= mp.Pool(processes=4)
在循环中,您无缘无故地启动了池的 10 个实例。也许尝试将其移出,看看您的内存使用量是否减少?
如果这没有帮助,请考虑重组代码以利用yield
,以防止内存填满。
pool.imap 创建的每个新进程都需要接收有关函数及其应用函数的元素的一些信息。此信息是副本,因此将导致信息成为副本。
如果你想减少它,你可能想看看pool.imap的chunksize参数。
另一种方法是仅依赖 numpy 中的函数。你现在可能已经这样做了,但你可以做results = test_array * 2
.我不知道你的现实生活中的例子是什么样的,但你可能不需要使用 Python 的池。
此外,如果您打算实际编写快速代码,请不要使用 tqdm。这很好,如果你需要它,你需要它,但它会减慢你的代码。