Python 使用多处理时内存泄漏

Python 使用多处理时内存泄漏,python,memory-leaks,threadpool,python-multiprocessing,Python,Memory Leaks,Threadpool,Python Multiprocessing,正如标题中所述,我在使用多处理时遇到了内存泄漏问题。我知道以前有人问过这样的问题,但我仍然找不到解决问题的正确方法 我有一个RGB图像列表(30.000total)。我需要读取每个图像,处理所有三个RGB通道,然后将结果保存在内存中(稍后保存在1大文件中) 我试着用这样的方法: import multiprocessing as mp import random import numpy as np # Define an output queue to store result outpu

正如标题中所述,我在使用
多处理
时遇到了内存泄漏问题。我知道以前有人问过这样的问题,但我仍然找不到解决问题的正确方法

我有一个RGB图像列表(
30.000
total)。我需要读取每个图像,处理所有三个RGB通道,然后将结果保存在内存中(稍后保存在
1
大文件中)

我试着用这样的方法:

import multiprocessing as mp
import random
import numpy as np


# Define an output queue to store result
output = mp.Queue()

# define a example function
def read_and_process_image(id, output):
    result = np.random.randint(256, size=(100, 100, 3)) #fake an image
    output.put(result)

# Setup a list of processes that we want to run
processes = [mp.Process(target=read_and_process_image, args=(id, output)) for id in range(30000)]

# Run processes
for p in processes:
    p.start()

# # Exit the completed processes
# for p in processes:
#     p.join()

# Get process results from the output queue
results = [output.get() for p in processes]

print(results)
这段代码使用了大量内存。解释了问题,但我找不到将其应用于代码的方法。有什么建议吗?谢谢


Edit:我也尝试了
joblib
Pool
类,但是代码不会像我预期的那样使用所有的核心(我认为对这两种情况使用普通
循环没有区别)

我会使用一个池来限制生成的进程数量。我已经根据您的代码编写了一个演示:

import multiprocessing as mp
import os
import numpy as np

# define a example function
def read_and_process_image(_id):
    print("Process %d is working" % os.getpid())
    return np.random.randint(256, size=(100, 100, 3))

# Setup a list of arguments that we want to run the function with
taskargs = [(_id) for _id in range(100)]

# open a pool of processes
pool = mp.Pool(max(1, mp.cpu_count() // 2))
# Run processes
results = pool.map(read_and_process_image, taskargs)

print(results)

我知道arguemnts没有被使用,但我想你会想看看如果你真的需要它怎么做(另外,我把
id
改为
\u id
,因为
id
是内置的)。

你不想启动30000个进程。使用池限制生成的进程数。如何使用池限制进程数(但使用我的CPU的所有核心)?我试过了,但是代码没有像我想的那样使用所有的CPU@Reutsharabani
pool=mp.pool(max1,mp.cpu\u count()//2))中的max1是什么?顺便说一句,如何添加更多任务参数?因为我的real
read_和_process_image
函数将像
read_和_process_image(_id,param_1,param_2)
。谢谢
max1…
max(1…
)的一个输入错误,我已经修复了它。它的目的是至少占用一个处理器,但如果您有更多处理器,则只占用一半处理器(因为您可能需要一些免费的处理器来做其他事情…)。您可以自己计算出要使用多少个处理器。要发送更多参数,只需展开taskargs中存储的元组即可。谢谢!我只是测试了您的建议,但它仍然会占用大量内存(例如,如果我使用
range(100000)
而不是
range(100)
,我可以看到我的RAM在几秒钟内用完)。这可能是因为此代码实际存储结果。如果使用
池,则可以选择不存储它们。应用\u async
。在这种情况下(使用
池。应用\u async
),如何获取
结果的列表?