我編寫了一個程序來關閉一些約220萬條記錄的數據。對於每個記錄,它將通過一系列20次計算,總共需要大約0.01秒。爲了讓它運行得更快,我使用Python多進程,將我的數據通常分成6個塊,並與主進程並行地運行它們,將有效負載分發到進程並協調執行。順便說一句,作爲計算的結果,該程序將向數據庫寫出大約2200萬條記錄。運行了很長時間並消耗大量內存足跡後奇怪的Python性能下降
我在MacBookPro i7 2.2GHz上運行,運行在Python 3.2.2上的8GB RAM。數據在本地MySQL服務器上。
程序啓動良好 - 以可預測的方式運行,CPU平均使用率爲60-70%,而我的Macbook Pro只是像烤箱一樣升溫。然後,運行約5個小時後CPU速度降低,每個內核的CPU利用率平均降低20%。我當時所做的一些觀察是: - 每個Python進程消耗大約480 MB真實RAM和大約850 MB虛擬RAM。總共有6個這些繁重的進程 - OSX消耗的總虛擬內存(如Activity Monitor所示)大約爲300GB
我懷疑性能下降是由於內存消耗巨大並且可能存在高頁面交換。
我該如何更好地診斷這些症狀? 長時間運行大內存對象的Python有沒有問題?真的,我不認爲運行6小時對於今天的技術來說是沉重的,但是我只有大約半年的Python經驗,所以......我知道什麼?!
謝謝!
我不知道你是否能夠使用存儲過程對數據庫本身進行這些計算,並消除中間層和網絡延遲。爲了進行一些計算,220萬條記錄中有很多字節來回移動。數據庫可以做到嗎? – duffymo
我已經考慮過這個選項,但沒有。我選擇Python的原因是編程速度快。這20個系列的計算只是一個開始,可能會很快增長。將它們作爲存儲過程來解決現在可能會解決我的性能問題,但它會降低我在實現附加計算插件邏輯方面的速度。我也試圖對2,200萬條記錄的db回寫進行評論,但這並沒有多大幫助。 – Thomas
不管你決定走哪條路,聽起來就像你必須這樣做,並以大塊的形式提交。 2.2M記錄的回滾段太大。 – duffymo