如何释放lxml.etree使用的内存?

Und*_*ryx 6 python memory lxml garbage-collection

我正在从一堆XML文件加载数据lxml.etree,但是我想在完成这个初始解析后关闭它们.目前,XML_FILES以下代码中的列表占用了程序的400 MiB已用内存的350 MiB.我试过del XML_FILES,del XML_FILES[:],XML_FILES = None,for etree in XML_FILES: etree = None,和几个,但这些都不似乎工作.我也在lxml文档中找不到关闭lxml文件的任何内容.这是解析的代码:

def open_xml_files():
    return [etree.parse(filename) for filename in paths]

def load_location_data(xml_files):
    location_data = {}

    for xml_file in xml_files:
        for city in xml_file.findall('City'):
            code = city.findtext('CityCode')
            name = city.findtext('CityName')
            location_data['city'][code] = name

        # [A few more like the one above]    

    return location_data

XML_FILES = utils.open_xml_files()
LOCATION_DATA = load_location_data(XML_FILES)
# XML_FILES never used again from this point on
Run Code Online (Sandbox Code Playgroud)

现在,我如何在这里摆脱XML_FILES?

Emm*_*ler 3

您可能会考虑etree.iterparse,它使用生成器而不是内存中的列表。与生成器表达式结合使用,这可能会为您的程序节省一些内存。

def open_xml_files():
    return (etree.iterparse(filename) for filename in paths)
Run Code Online (Sandbox Code Playgroud)

iterparse根据文件的解析内容创建一个生成器,同时parse立即解析文件并将内容加载到内存中。内存使用的差异来自于这样的事实:在调用iterparse其方法之前(在本例中,通过循环隐式调用),实际上并没有执行任何操作。next()for

编辑:显然 iterparse 确实增量工作,但不会像解析那样释放内存。当您遍历 xml 文档时,您可以使用此答案中的解决方案来释放内存。