Cherrypy中的内存消耗
我在一个使用Cherrypy的RESTful网络服务中,服务器返回的是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,也就是说没有额外的内存被使用。但是,如果传递不同的参数,服务器的内存使用量就会不断增加。释放内存的唯一方法就是重启服务器。
你知道为什么会这样吗?有什么解决办法吗?谢谢。
1 个回答
1
这个问题其实是一个通用的Python问题,并不特指CherryPy。effbot在这个问题上有个很棒的回答,大家可以去看看:http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm
另外,StackOverflow上也有一个类似的问题,答案也很不错,大家可以参考一下:我怎么能在Python中显式释放内存?