Cherrypy中的内存消耗

时间:2010-09-17 16:42:31

标签: python memory lxml cherrypy consumption

我在RESTful Web服务中使用Cherrypy,服务器返回XML(lxml用于创建XML)。其中一些XML非常庞大。我注意到在处理完这样的请求(返回大型XML)之后,内存没有被释放。

所以,我已经解决了一个问题并创建了一个非常简短的虚拟示例:

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,即不使用额外的内存。但是,如果传递不同的参数,服务器会消耗越来越多的内存。释放内存的唯一方法是重启服务器。

您对此为何发生以及如何解决有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

这是一个通用的Python问题,本身并不是一个真正的CherryPy。在http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

,effbot对这个问题有很好的答案

How can I explicitly free memory in Python?

上有一个类似的问题答案