knu*_*ole 11 python memory debugging lxml
编辑:非常感谢找到错误的帮助 - 但由于它可能很难找到/重现,任何一般调试帮助也将非常感谢!帮帮我自己!=)
编辑2:缩小范围,评论代码.
编辑3:似乎lxml可能不是罪魁祸首,谢谢!完整的脚本在这里.我需要重温它寻找参考.他们看起来怎么样?
编辑4:实际上,脚本在此 部分停止(100%)parse_og .所以编辑3是假的 - 它必须以某种方式lxml.
编辑5主要编辑:正如下面的David Robinson和TankorSmash所建议的那样,我发现了一种data将lxml.etree.HTML( data )在狂野循环中发送的内容.(我不小心忽略了它,但发现我的罪孽被赎回了,因为我付出了额外两天调试的价格!) 工作崩溃的脚本在这里. (还开了一个新问题.)
编辑6:原来这是lxml版本2.7.8及更低版本(至少)的错误.更新到lxml 2.9.0,错误消失了.还要感谢这个后续问题的优秀人士.
我不知道如何调试我遇到的这个奇怪的问题.下面的代码运行正常大约五分钟,当RAM突然完全填满时(在100%期间从200MB到1700MB - 然后当内存已满时,它进入蓝色等待状态).
这是由于下面的代码,特别是前两行.这是肯定的.但是发生了什么?有什么可能解释这种行为?
def parse_og(self, data):
""" lxml parsing to the bone! """
try:
tree = etree.HTML( data ) # << break occurs on this line >>
m = tree.xpath("//meta[@property]")
#for i in m:
# y = i.attrib['property']
# x = i.attrib['content']
# # self.rj[y] = x # commented out in this example because code fails anyway
tree = ''
m = ''
x = ''
y = ''
i = ''
del tree
del m
del x
del y
del i
except Exception:
print 'lxml error: ', sys.exc_info()[1:3]
print len(data)
pass
Run Code Online (Sandbox Code Playgroud)

您可以尝试使用 GDB 进行低级 Python 调试。Python 解释器或 lxml 库中可能存在错误,如果没有额外的工具很难找到它。
当 CPU 使用率达到 100% 时,您可以中断在 gdb 下运行的脚本并查看堆栈跟踪。它可能有助于理解脚本内部发生的事情。