使用多处理时内存泄漏

时间:2016-02-06 00:37:02

标签: python memory-leaks threadpool python-multiprocessing

在标题中,我在使用multiprocessing时遇到内存泄漏问题。我知道之前曾经问过像这样的问题,但我仍然无法找到解决问题的正确方法。

我有一个RGB图像列表(总共30.000)。我需要读取每个图像,处理所有三个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)

此代码使用大量内存。 This answer解释了这个问题,但我找不到将其应用于我的代码的方法。有什么建议吗?谢谢!

修改:我也尝试joblibPool类,但代码不会像我预期的那样使用所有内核(我发现使用普通代码之间没有区别for循环这两个案例)

1 个答案:

答案 0 :(得分:2)

我会使用池来限制生成的进程数。我依靠你的代码编写了一个演示文稿:

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改为_id,因为{{ 1}}是内置的。