2012-10-20 57 views
2

在GAE上,我的處理函數調用一個完成所有繁重工作的函數。所有的對象都是在函數中創建的。但是,在函數退出後(它爲response.out.write返回一個字符串),內存使用量不會下降。對GAE的第一次http呼叫有效,但之後內存保持在大約100MB。第二次訪問嘗試失敗,因爲已達到私人內存限制。爲什麼函數返回後內存不能被釋放?

我已經清除了我編寫的所有類靜態對象,並且無效地調用了第三方庫的close和clear函數。如何幹淨地釋放內存?我寧願強制重啓而不是追蹤內存泄漏。性能不是問題。

我知道這不是由於GC導致的。 GAE報告說,記憶長時間保持高水平。上面的兩個http調用被分隔或更長。

我試過在Handler.get函數中導入我的函數。在提供頁面之後,我嘗試刪除所有導入的第三方模塊,然後刪除我自己的模塊。從理論上講,每次調用都應該重新啓動所有可疑模塊,但內存問題仍然存在。調用之間留下的唯一(預期的)模塊應該是標準庫模塊(包括lxml,xml等)。

編輯: 我現在使用taskqueue來安排後端實例上的重型部件,並使用db.Blob來傳遞結果。獲得後端工作解決了內存問題。後端的GAE文檔已完成,但令人困惑。關鍵是需要遵循1)編輯backends.yaml的指示2)使用appcfg進行更新(從啓動器部署是不夠的)。之後檢查管理員後端是否已啓動。此外,taskqueue target =在開發服務器上中斷,因此需要在開發服務器上解決它。

回答

2

這可能是由於以下事實:沒有什麼說垃圾回收器(它負責釋放未使用的內存)將在函數返回時直接啓動。

你可以手動強制它通過一些黑客踢,但如果兩個http請求發生aprox不會解決任何問題。與此同時。

相反,我建議您大致看一下它不需要你做的每個請求繁重的解決方案。

如果產生的數據是爲每個請求看,如果你可以做你的(有限)專用內存池以外的計算是唯一的。


我怎麼手動啓動垃圾收集器?

當你的重物變量已超出範圍使用下面的方法調用GC。

import gc 

... 

gc.collect() 
相關問題