我在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,即不使用額外的內存。但是,如果傳遞不同的參數,服務器會消耗越來越多的內存。釋放內存的唯一方法是重新啓動服務器。
您對這種情況發生的原因以及如何解決它有什麼想法嗎?謝謝。
一個偉大的答案的問題嗎? – unutbu 2010-09-17 17:06:57
我正在使用Ubuntu。我急於釋放內存的原因是數據庫超過100GB。隨着服務器越來越多地運行,有更多不同的請求導致使用更多的內存。我的擔心是當內存消耗接近物理內存大小時會發生什麼?當新的請求到來時,Python是否會知道如何重用當前存儲的內存(但哪些內存沒有被使用)?我想是的,但只是想檢查。另外,如果還有其他需要內存的進程呢?他們將使用什麼內存? – kevin 2010-09-17 22:09:12