Потребление памяти в Cherrypy - PullRequest
       31

Потребление памяти в Cherrypy

5 голосов
/ 17 сентября 2010

Я использую 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, потребление памяти увеличивается с 830 МБ до 1,2 ГБ. Затем, после обработки запроса, он уменьшается до 1,1 ГБ и остается там до выключения сервера. После выключения сервера потребление памяти снижается до 830 МБ.

В моем проекте данные (разумеется) поступают из базы данных, и параметры используются для указания того, какие данные следует извлекать. Если выполняется один и тот же запрос (с теми же параметрами), объем памяти остается равным 1,1 ГБ, т. Е. Дополнительная память не используется. Но если передаются разные параметры, сервер продолжает потреблять все больше и больше памяти. Единственный способ освободить память - перезапустить сервер.

Есть ли у вас идеи о том, почему это происходит и как это решить? Спасибо.

1 Ответ

1 голос
/ 17 сентября 2010

Это общая проблема Python, а не CherryPy как таковая.У effbot отличный ответ на этот вопрос на http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

И есть аналогичный вопрос SO с отличным ответом на Как я могу явно освободить память в Python?

...