2010-09-17 113 views
5

我在REST風格的Web服務中使用Cherrypy,服務器因此返回XML(使用lxml創建XML)。其中一些XML非常大。我注意到,在處理完這種請求(返回大的XML)後,內存不會被釋放。Cherrypy中的內存消耗

所以,我已經分離的問題,並創造了這個一個很短假例如:

import cherrypy 
from lxml import etree 

class Server: 
    @cherrypy.expose 
    def index(self): 
     foo = etree.Element('foo') 
     for i in range(200000): 
      bar = etree.SubElement(foo, 'bar') 
      bar1 = etree.SubElement(bar, 'bar1') 
      bar1.text = "this is bar1 text ({0})".format(i) 
      bar2 = etree.SubElement(bar, 'bar2') 
      bar2.text = "this is bar2 text ({0})".format(i) 
      bar3 = etree.SubElement(bar, 'bar3') 
      bar3.text = "this is bar3 text ({0})".format(i) 
      bar4 = etree.SubElement(bar, 'bar4') 
      bar4.text = "this is bar4 text ({0})".format(i) 
      bar5 = etree.SubElement(bar, 'bar5') 
      bar5.text = "this is bar5 text ({0})".format(i) 

     return etree.tostring(foo, pretty_print=True) 

if __name__ == '__main__': 
    cherrypy.quickstart(Server()) 

請求後已經取得了:http://localhost:8080/index,內存消耗從830MB變爲1.2GB。然後,在請求處理完成後,它將降低到1.1GB,並保持在那裏直到服務器關閉。服務器關閉後,內存消耗降至830MB。

在我的項目中,數據(當然)來自數據庫,並且正在使用參數來指定應該檢索哪些數據。如果有相同的請求(具有相同的參數),則內存保持在1.1GB,即不使用額外的內存。但是,如果傳遞不同的參數,服務器會消耗越來越多的內存。釋放內存的唯一方法是重新啓動服務器。

您對這種情況發生的原因以及如何解決它有什麼想法嗎?謝謝。

+0

一個偉大的答案的問題嗎? – unutbu 2010-09-17 17:06:57

+0

我正在使用Ubuntu。我急於釋放內存的原因是數據庫超過100GB。隨着服務器越來越多地運行,有更多不同的請求導致使用更多的內存。我的擔心是當內存消耗接近物理內存大小時會發生什麼?當新的請求到來時,Python是否會知道如何重用當前存儲的內存(但哪些內存沒有被使用)?我想是的,但只是想檢查。另外,如果還有其他需要內存的進程呢?他們將使用什麼內存? – kevin 2010-09-17 22:09:12

回答

1

這是一個通用的Python問題,本身並不是一個CherryPy。 effbot具有http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

一個偉大的回答這個問題,有一個相似的,所以跟你使用的是什麼操作系統在How can I explicitly free memory in Python?

+0

我明白了。非常感謝答案。內存消耗接近物理內存限制並出現新請求時會發生什麼情況? Python會知道如何重用進程持有但不使用的內存?其他需要內存的進程會發生什麼?我應該考慮在這裏使用進程而不是線程嗎?隨着時間的推移,這臺服務器將佔用越來越多的內存(因爲不同的請求會來)。有沒有什麼時候Python會開始重用這個佔用的內存(但沒有使用內存),或者它只會運行我們的內存並開始使用交換? – kevin 2010-09-17 22:22:16

+1

是的,Python會重用內存。其他需要內存的進程通常會與操作系統進行競爭。在Linux操作系統中尋找「OOM殺手」。線程是共享的設備,因此與進程相比*減少*內存消耗。最後,是的,swap一直在使用。閱讀你的操作系統文檔。 – fumanchu 2010-10-04 16:17:32