为什么这段代码随着时间的推移使用越来越多的内存?

问题描述 投票:0回答:1

Python:3.11 撒克逊:12.4.2

我的网站不断消耗越来越多的内存,直到服务器耗尽内存并崩溃。我将有问题的代码隔离到以下脚本中:

import gc
from time import sleep

from saxonche import PySaxonProcessor


xml_str = """
<root>
    <stuff>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac auctor ex. Nunc in tincidunt urna. Sed tincidunt eros lacus, sed pulvinar sem venenatis et. Donec euismod orci quis pellentesque sagittis. Donec at tortor in dui mattis facilisis. Pellentesque vel varius lectus. Nunc sed gravida risus, ac finibus elit. Etiam sollicitudin nunc a velit efficitur molestie in ac lectus. Donec vulputate orci odio, sit amet hendrerit odio rhoncus commodo.</stuff>
    <stuff>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac auctor ex. Nunc in tincidunt urna. Sed tincidunt eros lacus, sed pulvinar sem venenatis et. Donec euismod orci quis pellentesque sagittis. Donec at tortor in dui mattis facilisis. Pellentesque vel varius lectus. Nunc sed gravida risus, ac finibus elit. Etiam sollicitudin nunc a velit efficitur molestie in ac lectus. Donec vulputate orci odio, sit amet hendrerit odio rhoncus commodo.</stuff>
    <stuff>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac auctor ex. Nunc in tincidunt urna. Sed tincidunt eros lacus, sed pulvinar sem venenatis et. Donec euismod orci quis pellentesque sagittis. Donec at tortor in dui mattis facilisis. Pellentesque vel varius lectus. Nunc sed gravida risus, ac finibus elit. Etiam sollicitudin nunc a velit efficitur molestie in ac lectus. Donec vulputate orci odio, sit amet hendrerit odio rhoncus commodo.</stuff>
</root>
"""

while True:
    print('Running once...')
    with PySaxonProcessor(license=False) as proc:
        proc.parse_xml(xml_text=xml_str)

    gc.collect()
    sleep(1)

该脚本以每秒约 0.5 MB 的速度消耗内存。一段时间后,内存使用量不会达到稳定水平。我的日志显示内存使用量持续增长数小时,直到服务器耗尽内存并崩溃。

我尝试过的其他事情上面没有显示:

  • 使用 PyDocumentBuilder 而不是 PySaxonProcessor 来解析 XML。它似乎没有改变任何东西。
  • 使用
    parse_xml()
    Python 关键字删除 Saxon 处理器和
    del
    的返回值。没有变化。

我必须使用 Saxon 而不是 lxml,因为我需要 XPath 3.0 支持。

我做错了什么?如何使用 Saxon 以不泄漏的方式解析 XML?

python saxon saxon-c
1个回答
0
投票

Saxon 处理器在循环中使用而没有得到适当的清理。每次循环运行时,都会创建一个新的 PySaxonProcessor 实例,但在处理完 XML 后没有正确释放它。这可能会导致内存泄漏,因为处理器使用的资源没有被释放。

重写你的代码:

with PySaxonProcessor(license=False) as proc:
    while True:
        print('Running once...')
        proc.parse_xml(xml_text=xml_str)
        gc.collect()
        sleep(1)

我没有测试它,但它可能会解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.