Estoy usando Cherrypy en un servicio web RESTful y el servidor devuelve XML como resultado (lxml se usa para crear XML). Algunos de esos XML son bastante grandes. Me di cuenta de que la memoria no se está liberando después de que se haya procesado dicha solicitud (que devuelve XML grande).Consumo de memoria en Cherrypy
lo tanto, he aislado un problema y ha creado este un ejemplo ficticio muy corto:
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())
Después solicitud ha sido hecha a: http://localhost:8080/index, el consumo de memoria va desde 830MB a 1.2GB. Luego, una vez procesada la solicitud, baja a 1.1GB y permanece allí hasta que el servidor se apaga. Después de que el servidor se apaga, el consumo de memoria disminuye a 830 MB.
En mi proyecto, los datos (por supuesto) provienen de la base de datos, y los parámetros se utilizan para especificar qué datos se deben recuperar. Si se realiza la misma solicitud (con los mismos parámetros), la memoria permanece en 1,1 GB, es decir, no se está utilizando memoria adicional. Pero, si se pasan diferentes parámetros, el servidor sigue consumiendo más y más memoria. La única forma de liberar la memoria es reiniciar el servidor.
¿Tiene alguna idea sobre por qué sucede esto y cómo resolverlo? Gracias.
¿Qué sistema operativo está utilizando? – unutbu
Estoy usando Ubuntu. La razón por la que estaba ansioso por que se liberara la memoria es porque la base de datos supera los 100 GB. A medida que el servidor se ejecuta cada vez más, hay más solicitudes diferentes que resultan con más memoria en uso. Mi preocupación era ¿qué sucederá cuando este consumo de memoria se acerque al tamaño físico de la memoria? ¿Sabrá Python cómo reutilizar la memoria que está reteniendo actualmente (pero que no se está utilizando) cuando lleguen nuevas solicitudes? Supongo que sí, pero solo quería comprobar. Además, ¿qué pasa si hay otros procesos que están en demanda de memoria? ¿Qué memoria usarán? – kevin