lxml解析器吃掉所有内存

And*_*aev 12 python lxml memory-leaks

我正在python中编写一些蜘蛛并使用lxml库来解析html和gevent库以进行异步.我发现在经过一段时间的工作之后,lxml解析器开始占用内存高达8GB(所有服务器内存).但我只有100个异步线程,每个线程解析文件最大为300kb.

我测试并在lxml.html.fromstring中启动该问题,但我无法重现此问题.

这行代码中的问题:

HTML = lxml.html.fromstring(htmltext)
Run Code Online (Sandbox Code Playgroud)

也许有人知道它可能是什么,或锄头来解决这个问题?

感谢帮助.

PS

Linux Debian-50-lenny-64-LAMP 2.6.26-2-amd64 #1 SMP Tue Jan 25 05:59:43 UTC 2011 x86_64    GNU/Linux
Python : (2, 6, 6, 'final', 0)
lxml.etree : (2, 3, 0, 0)
libxml used : (2, 7, 8)
libxml compiled : (2, 7, 8)
libxslt used : (1, 1, 26)
libxslt compiled : (1, 1, 26)
Run Code Online (Sandbox Code Playgroud)

UP:

我为使用lxml解析器的进程设置了ulimit -Sv 500000和uliit -Sm 615000.

现在有一段时间他们开始写错误日志:

"忽略"错误"lxml.etree._BaseErrorLog._receive中的异常MemoryError:MemoryError()".

并且我无法捕获此异常,因此它会在日志中递归写入此消息,因为磁盘上有可用空间.

我怎样才能捕获这个异常以杀死进程,所以守护进程可以创建新进程?

Ste*_*ven 7

您可能会保留一些使文档保持活动的引用.例如,请注意来自xpath评估的字符串结果:默认情况下,它们是"智能"字符串,它提供对包含元素的访问,因此如果您保留对它们的引用,则将树保留在内存中.请参阅有关xpath返回值的文档:

在某些情况下,智能串行为是不合需要的.例如,这意味着树将由字符串保持活动,在字符串值是树中唯一实际感兴趣的事物的情况下,这可能具有相当大的内存影响.对于这些情况,您可以使用关键字参数smart_strings取消激活父母关系.

(我不知道你的情况下这是不是问题,但它是候选人.我曾经被自己咬过一次;-))