Cherrypy中的内存消耗

7 投票
1 回答
2587 浏览
提问于 2025-04-16 04:17

我在一个使用Cherrypy的RESTful网络服务中,服务器返回的是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 个回答

1

这个问题其实是一个通用的Python问题,并不特指CherryPy。effbot在这个问题上有个很棒的回答,大家可以去看看:http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

另外,StackOverflow上也有一个类似的问题,答案也很不错,大家可以参考一下:我怎么能在Python中显式释放内存?

撰写回答