2012-02-01 83 views
2

我想要做的是監控系統資源使用情況,並動態增加/減少池中的工作量。python多處理中的動態工作池管理

我有一個24核心節點和48GB的RAM,我所做的是在一個4GB數據文件中讀取,我需要過濾。該系統也被其他人使用,因此可用內存隨時間而變化。由於4GB輸入數據被複制到所有工作人員(我還沒有找到一種方法來避免這種情況,因爲我只需要在工作人員中只讀它,建議歡迎,這是一個dict()和dict()列表)這意味着我無法派出24名工人,因爲我立即用完了內存。所以我想要做的就是開始這個​​過程,說一個安全數量爲6的工人,然後觀察內存使用情況,併產生額外的工作人員到池中,如果內存使用率高,減少工人的數量(即允許一些完成,但不會爲這些工作者產生新的任務)。這樣我可以最大限度地利用節點,同時保持95%的內存使用率。

這將是有效的原因是因爲整個代碼幾個小時甚至跑6-12並行的工人,所以如果我甚至可以在一段時間增加工人的數量20-30%它會降低總執行時間處理時間。

現在我用兩個Pool.map()和Pool.apply_async()方法來發送任務池中,以便我沒有直接的偏好,如果一個方法比另一個更好。

在此先感謝您的建議。

回答

3

多處理模塊提供了多進程的方式來share a dict

manager = mp.Manager() 
d = manager.dict() 

也許通過使用一個共享的字典,你能產卵24名工人和仍然使用遠遠更少的內存。當一個工人訪問或變異的字典,其他工人將阻塞,如果他們也試圖訪問或突變的字典,但如果這不是主要的瓶頸,能夠使用24名工人可以大大減少你的執行時間。

+0

事實上,使用管理限制了內存曝光,並允許所以對我來說暫時已經緩解了問題運行多個進程,但它仍然是很好的知道如何動態地管理池的工人數量。 – 2012-02-01 16:21:33