python - Cherrypy 中的内存消耗

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

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

最佳答案

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

How can I explicitly free memory in Python? 有一个类似的 SO 问题,答案很好

关于python - Cherrypy 中的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3737268/

相关文章:

c# - 附加到序列化集合

matlab - 如何在不创建变量的情况下确定内存中变量的大小?

python - 获取 lxml 节点中的所有文本

python - 我的 Python 代码没有写入我的文件。为什么?

javascript - 在 Google App Engine 中使用 JavaScript 将可下载文件添加到另一个页面

ios - 如何调试 NSZombies 和内存泄漏?

python - 使用python lxml循环提取文本的问题

python - 无法解析来自 `th` 标记的数据以及来自不同表的 `td` 标记

python - 使用 Python 将 Excel 转换为 JSON

python - 奇怪的输出 sys.getsizeof()