Python/lxml 占用太多内存

Python/lxml is eating too much memory

该程序非常简单,递归地下降到目录并提取一个元素。目录为 1k,大约有 200 个 0.5m 的文件。 我看到它在一段时间后消耗了大约 2.5g 的内存,这是完全不能接受的,脚本不是一个人吃光了所有东西。我不明白为什么它不释放内存。显式删除没有帮助。 有什么技巧可以考虑吗?


from lxml import etree
import os

res=set()
for root, dirs, files in os.walk(basedir):
    for i in files:
        tree = etree.parse(os.path.join(root,i), parser)
        for i in tree.xpath("//a[@class='ctitle']/@href"):
            res.add(i)
        del tree

您正在保留对树中元素的引用,_ElementUnicodeResult。该元素保留对其父元素的引用。这可以防止整棵树被垃圾收集。

尝试将元素转换为字符串并存储:

from lxml import etree
import os

titles = set()
for root, dirs, files in os.walk(basedir):
    for filename in files:
        tree = etree.parse(os.path.join(root, filename), parser)
        for title in tree.xpath("//a[@class='ctitle']/@href"):
            titles.add(str(title))