6

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

您对为什么会发生这种情况以及如何解决它有任何想法吗?谢谢。

4

1 回答 1

1

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

如何在 Python 中显式释放内存?

于 2010-09-17T17:57:43.687 回答