我在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,即不使用额外的内存。但是,如果传递不同的参数,服务器会消耗越来越多的内存。释放内存的唯一方法是重启服务器。
您对此为何发生以及如何解决有任何想法吗?感谢。
答案 0 :(得分:1)
这是一个通用的Python问题,本身并不是一个真正的CherryPy。在http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm
,effbot对这个问题有很好的答案 上有一个类似的问题答案