我在 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/