使用 multiprocessing.pool() 遍历列表
Looping through a list using multiprocessing.pool()
我在 N
文件列表中调用具有大量内存开销的函数。内存开销大的原因有很多因素,不修改函数是无法解决的,不过我用multiprocessing
模块解决了内存泄漏问题。通过为每个 N
文件创建一个子进程,然后调用 pool.close()
,以最小的开销释放函数的内存。我在以下示例中实现了这一点:
def my_function(n):
do_something(file=n)
return
if __name__ == '__main__':
# Initialize pool
for n in range(0,N,1):
pool = mp.Pool(processes=1)
results = pool.map(my_function,[n])
pool.close()
pool.join()
这正是我想要的:通过在 pool
中设置 processes=1
,N
个文件一次 运行 个文件。在每个 n
文件之后,我调用 pool.close()
,它关闭进程并将内存释放回 OS。之前,我根本不用multiprocessing
,只是一个for
循环,内存会累积到我的系统崩溃。
我的问题是
- 这是实现它的正确方法吗?
- 有没有更好的实现方式?
- 有没有办法一次 运行 多个进程 (
processes>1
),并且在每次 n
之后仍然释放内存?
我刚刚了解 multiprocessing
模块。我在这里找到了很多 multiprocessing
个例子,但是 none 是针对这个问题的。我会很感激我能得到的任何帮助。
Is this the correct way to implement this?
"Correct"是本例中的一个值判断。
人们可以认为这是一个障碍或一个聪明的黑客。
Is there a better way to implement this?
是的。修复 my_function
使其不会泄漏内存。
如果 Python 函数泄漏了大量内存,很可能是您做错了什么。
Is there a way to run more than one process at a time (processes>1), and still have the memory released after each n?
是的。创建 Pool
.
时使用 maxtasksperchild
参数
我在 N
文件列表中调用具有大量内存开销的函数。内存开销大的原因有很多因素,不修改函数是无法解决的,不过我用multiprocessing
模块解决了内存泄漏问题。通过为每个 N
文件创建一个子进程,然后调用 pool.close()
,以最小的开销释放函数的内存。我在以下示例中实现了这一点:
def my_function(n):
do_something(file=n)
return
if __name__ == '__main__':
# Initialize pool
for n in range(0,N,1):
pool = mp.Pool(processes=1)
results = pool.map(my_function,[n])
pool.close()
pool.join()
这正是我想要的:通过在 pool
中设置 processes=1
,N
个文件一次 运行 个文件。在每个 n
文件之后,我调用 pool.close()
,它关闭进程并将内存释放回 OS。之前,我根本不用multiprocessing
,只是一个for
循环,内存会累积到我的系统崩溃。
我的问题是
- 这是实现它的正确方法吗?
- 有没有更好的实现方式?
- 有没有办法一次 运行 多个进程 (
processes>1
),并且在每次n
之后仍然释放内存?
我刚刚了解 multiprocessing
模块。我在这里找到了很多 multiprocessing
个例子,但是 none 是针对这个问题的。我会很感激我能得到的任何帮助。
Is this the correct way to implement this?
"Correct"是本例中的一个值判断。 人们可以认为这是一个障碍或一个聪明的黑客。
Is there a better way to implement this?
是的。修复 my_function
使其不会泄漏内存。
如果 Python 函数泄漏了大量内存,很可能是您做错了什么。
Is there a way to run more than one process at a time (processes>1), and still have the memory released after each n?
是的。创建 Pool
.
maxtasksperchild
参数