6

私はRESTfulWebサービスでCherrypyを使用していますが、サーバーは結果として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のままです。つまり、追加のメモリは使用されていません。ただし、異なるパラメータが渡されている場合、サーバーはますます多くのメモリを消費し続けます。メモリを解放する唯一の方法は、サーバーを再起動することです。

なぜこれが起こっているのか、そしてそれをどのように解決するのかについて何かアイデアはありますか?ありがとう。

4

1 に答える 1

1

これは一般的なPythonの問題であり、実際にはCherryPy自体の問題ではありません。effbotには、この質問に対する優れた回答がhttp://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htmにあります。

そして、Pythonでメモリを明示的に解放するにはどうすればよいですか?

于 2010-09-17T17:57:43.687 に答える