我已經writen,可以總結如下的程序:的Python多的內存使用情況
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
真正的代碼(尤其是'writeOutput()')是一個複雜得多。 'writeOutput()'只使用這些值作爲它的參數(意思是它沒有引用對象)
基本上,它將一個巨大的數據集加載到內存中並對其進行處理。寫入輸出被委託給一個子進程(它實際上寫入多個文件,這需要很多時間)。 因此,每次處理一個數據項時,都會將其發送到子進程槽res_queue,然後根據需要將結果寫入文件。
子進程不需要以任何方式訪問,讀取或修改由'loadHugeData()'加載的數據。子流程只需要使用主流程通過'res_queue'發送的內容。這導致我的問題和疑問。
在我看來,子進程得到它的巨大數據集的副本(當檢查內存使用'頂')。這是真的?如果是這樣,那麼我怎麼能避免id(本質上使用雙內存)?
我正在使用Python 2.6並且程序在linux上運行。
你可以重構你的代碼來使用迭代器,而不是加載所有loadHugeData?看起來你可以,如果它看起來像加載/進程/入隊/出隊/寫 – sotapme
「hugeData」不幸是一個製表符分隔的txt文件,基本上包含一個稀疏的數組。我需要在處理過程中根據行號「隨機訪問」這些數據。因此將其加載到內存中(使用稀疏陣列特定的優化)可以使處理速度更快。 – FableBlaze
這可能是大規模的過度工程,建議使用'[beanstalkd](https://github.com/earl/beanstalkc/blob/master/TUTORIAL.mkd)之類的東西進行流程整合,但知道知道如果它幫助/縮放/執行。像往常一樣,其他人的問題總是更有趣。 – sotapme