2016-02-06 16 views
1

與標題一樣,當使用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循環與這兩個病例之間沒有區別)

+0

您不想啓動30000個進程。使用一個池來限制你產生的進程的數量。 –

+0

如何使用池來限制進程的數量(但使用我的CPU的所有內核)?我試過了,但是代碼沒有按照我的意願使用所有的CPU。 @ReutSharabani – trminh89

回答

2

我'd使用池來限制產生的進程數量。我寫了一個示範依靠代碼:

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更改爲_id)。

+0

什麼是max1在'pool = mp.Pool(max1,mp.cpu_count()// 2))'?順便說一句,如何添加更多的taskargs?因爲我真正的'read_and_process_image'函數會喜歡'read_and_process_image(_id,param_1,param_2)'。謝謝! – trminh89

+0

'max1 ...'是max(1 ...)的拼寫錯誤,我修正了它,目的是至少要有一個處理器,但如果你有更多處理器,只有一半處理器(因爲你可能需要一些處理器自由地做其他事情......)你可以計算出你想使用自己的處理器數量,發送更多參數只需展開存儲在taskargs中的元組。 –

+0

謝謝!我只是測試你的建議,但它仍然使用很多的內存(例如,如果我使用'range(100000)'而不是'range(100)',我可以看到我的RAM在幾秒鐘內耗盡)。 – trminh89