编辑:非常感谢找到错误的帮助 - 但由于它可能很难找到/重现,所以任何一般的调试帮助也会非常感激!帮帮我自己! =)
编辑2:缩小范围,注释掉代码。
编辑3:似乎lxml可能不是罪魁祸首,谢谢!完整脚本为here。我需要重温它寻找参考。它们看起来像什么?
编辑4:实际上,脚本停止(100%),其中 parse_og
部分。所以编辑3是假的 - 它必须以某种方式lxml。
编辑5主要编辑:正如下面的David Robinson和TankorSmash所建议的那样,我发现了一种data
内容,它会在一个狂野循环中发送lxml.etree.HTML( data )
。 (我不小心忽视了它,但发现我的罪赎回了,因为我付出了额外两天调试的价格!;)A working crashing script is here. (Also opened a new question.) < / p>
编辑6:原来这是lxml版本2.7.8及更低版本(at 最小)。 Updated to lxml 2.9.0,错误消失了。还要感谢this follow-up question.
的优秀人才
我不知道如何调试我遇到的这个奇怪的问题。 下面的代码运行正常大约五分钟,当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
答案 0 :(得分:3)
您可以尝试Low-level Python debugging with GDB。可能是Python解释器或lxml库中存在一个错误,如果没有额外的工具,很难找到它。
当CPU使用率达到100%时,您可以中断在gdb下运行的脚本并查看堆栈跟踪。它可能有助于理解脚本内部发生了什么。
答案 1 :(得分:2)
它必须是由于一些保持文件存活的引用。必须始终小心xpath评估的字符串结果。我们看到您已将None
分配给tree
和m
,但未分配给y
,x
和i
。
您还可以将None
分配给y
,x
和i
。
答案 2 :(得分:2)
在尝试追踪内存问题时,工具也很有用。我发现guppy是一个非常有用的Python内存分析和探索工具。
由于缺乏良好的教程/文档,这并不是最简单的开始,但是一旦你掌握它,你会发现它非常有用。我使用的功能: