Я использую 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 ГБ, т. Е. Дополнительная память не используется. Но если передаются разные параметры, сервер продолжает потреблять все больше и больше памяти. Единственный способ освободить память - перезапустить сервер.
Есть ли у вас идеи о том, почему это происходит и как это решить? Спасибо.