我在REST风格的Web服务中使用Cherrypy,服务器因此返回XML(使用lxml创建XML)。其中一些XML非常大。我注意到,在处理完这种请求(返回大的XML)后,内存不会被释放。Cherrypy中的内存消耗
所以,我已经分离的问题,并创造了这个一个很短假例如:
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,即不使用额外的内存。但是,如果传递不同的参数,服务器会消耗越来越多的内存。释放内存的唯一方法是重新启动服务器。
您对这种情况发生的原因以及如何解决它有什么想法吗?谢谢。
一个伟大的答案的问题吗? – unutbu 2010-09-17 17:06:57
我正在使用Ubuntu。我急于释放内存的原因是数据库超过100GB。随着服务器越来越多地运行,有更多不同的请求导致使用更多的内存。我的担心是当内存消耗接近物理内存大小时会发生什么?当新的请求到来时,Python是否会知道如何重用当前存储的内存(但哪些内存没有被使用)?我想是的,但只是想检查。另外,如果还有其他需要内存的进程呢?他们将使用什么内存? – kevin 2010-09-17 22:09:12