我在 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,即没有使用额外的内存。但是,如果传递不同的参数,服务器会不断消耗越来越多的内存。释放内存的唯一方法是重新启动服务器。
您对为什么会发生这种情况以及如何解决它有任何想法吗?谢谢。