下面有一个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
我有几个问题,感谢您知道以下答案:
答案 0 :(得分:1)
我还没有尝试过,但是我很确定你不需要定义
pool= mp.Pool(processes=4)
在循环中,您无缘无故地启动了10个池实例。也许尝试将其移出,看看是否减少了内存使用量?
如果这样做没有帮助,请考虑使用yield
来重组代码,以防止内存被占用。
答案 1 :(得分:1)
pool.imap创建的每个新进程都需要接收有关该功能及其应用该功能的元素的一些信息。此信息是副本,因此将导致信息成为副本。
如果要减少它,则可能需要查看pool.imap的chunksize参数。
另一种方法是仅依赖numpy中的函数。您现在可能已经开始,但是可以执行results = test_array * 2
。我不知道您的现实生活示例是什么样子,但您可能不需要使用Python的池。
此外,如果您打算实际编写快速代码,请不要使用tqdm。很好,如果您需要它,则需要它,但这会减慢您的代码速度。