Cherrypy中的内存消耗

kev*_*vin 5 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())
Run Code Online (Sandbox Code Playgroud)

在请求:http:// localhost:8080/index后,内存消耗从830MB变为1.2GB.然后,在处理完请求后,它会降至1.1GB并保持不变直到服务器关闭.服务器关闭后,内存消耗降至830MB.

在我的项目中,数据(当然)来自数据库,并且正在使用参数来指定应该检索哪些数据.如果进行相同的请求(具有相同的参数),则内存保持为1.1GB,即不使用额外的内存.但是,如果传递不同的参数,服务器会消耗越来越多的内存.释放内存的唯一方法是重启服务器.

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

fum*_*chu 1

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

还有一个类似的问题,在How can I明确释放Python中的内存?