當queue.put()的速度比queue.get()速度快時,我發現P1進程將使用大內存(因爲P1從一個大型文本文件中不斷插入行) 。即使P2已經完成從隊列中排隊。 P1使用的內存不會釋放。如何解決這個問題?以下是樣本和測試代碼。多處理隊列不釋放內存
謝謝!
import time
from multiprocessing import Process, Queue
def addline(q):
f = file('a big text file','r')
line = True
while line:
line = f.readline()
q.put(line, False)
f.close()
print "P1:finished"
while 1:
time.sleep(2)
def getline(q):
f = file('/tmp/bak','w')
line = True
while line:
line=q.get()
f.write(line)
time.sleep(0.01)
f.close()
print "p2:finished"
if __name__ == "__main__":
q = Queue()
p1 = Process(name="addline", target=addline, args=(q,))
p2 = Process(name="getline", target=getline, args=(q,))
p1.start()
p2.start()
編輯: 我嘗試讀取文本文件(44MB),然後觀察的/ proc/PID/smaps。我發現沒有發佈的內存在堆中變成Private_Dirty。
00fb3000-04643000 rw-p 00000000 00:00 0 [heap]
Size: 55872 kB
Rss: 55844 kB
Pss: 55163 kB
Shared_Clean: 0 kB
Shared_Dirty: 1024 kB
Private_Clean: 0 kB
Private_Dirty: 54820 kB
Referenced: 54972 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
你在'getline()'中用'while 1:q.get()'做什麼? –
在這個測試案例中,我只想保留P2。我已將其刪除。謝謝。 – jess
您是否考慮過爲您的隊列設置限制?如果閱讀過程無法跟上,那麼沒有限制,整個東西必須緩衝在隊列中。 – mata