我看过几篇关于使用 Python 多处理模块的内存使用情况的帖子。然而这些问题似乎并不能回答我在这里遇到的问题。我将我的分析发表出来,希望有人能帮助我。
Issue
我正在使用多处理并行执行任务,我注意到工作进程的内存消耗无限增长。我有一个小的独立示例,应该可以复制我注意到的内容。
import multiprocessing as mp
import time
def calculate(num):
l = [num*num for num in range(num)]
s = sum(l)
del l # delete lists as an option
return s
if __name__ == "__main__":
pool = mp.Pool(processes=2)
time.sleep(5)
print "launching calculation"
num_tasks = 1000
tasks = [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
for f in tasks:
print f.get(5)
print "calculation finished"
time.sleep(10)
print "closing pool"
pool.close()
print "closed pool"
print "joining pool"
pool.join()
print "joined pool"
time.sleep(5)
System
我正在运行 Windows,并使用任务管理器来监视内存使用情况。我正在运行Python 2.7.6。
观察
我总结了下面2个工作进程的内存消耗。
+---------------+----------------------+----------------------+
| num_tasks | memory with del | memory without del |
| | proc_1 | proc_2 | proc_1 | proc_2 |
+---------------+----------------------+----------------------+
| 1000 | 4884 | 4694 | 4892 | 4952 |
| 5000 | 5588 | 5596 | 6140 | 6268 |
| 10000 | 6528 | 6580 | 6640 | 6644 |
+---------------+----------------------+----------------------+
在上表中,我尝试更改任务数量并观察所有计算结束时和之前消耗的内存join
-ing 的pool
。 'del' 和 'without del' 选项是我是否取消注释或注释del l
线内的calculate(num)
分别发挥作用。计算前,内存消耗在4400左右。
- 看起来手动清除列表会降低工作进程的内存使用量。我以为垃圾收集器会处理这个问题。有没有办法强制垃圾收集?
- 令人费解的是,随着任务数量的增加,这两种情况下的内存使用量都在不断增长。有没有办法限制内存使用?
我有一个基于此示例的流程,旨在长期运行。我观察到这个工作进程在一夜运行后占用了大量内存(~4GB)。做一个join
释放内存不是一个选择,我正在尝试找出一种不使用内存的方法join
-ing.
这似乎有点神秘。有人遇到过类似的事情吗?我该如何解决这个问题?