编辑:非常感谢在查找错误方面的帮助 - 但由于它可能很难找到/重现,任何一般的调试帮助也将不胜感激!帮助我帮助我自己! =)
编辑2:缩小范围,注释掉代码。
编辑3:看来lxml可能不是罪魁祸首,谢谢!完整的脚本是here http://pastebin.com/iar4MhY6。我需要仔细检查一下,寻找参考资料。他们看起来怎么样?
编辑 4:实际上,脚本在此停止(100%) parse_og
一部分。所以编辑 3 是错误的 - 它一定是 lxml 不知何故。
编辑 5 主要编辑:正如下面 David Robinson 和 TankorSmash 的建议,我发现了一种data
将发送的内容lxml.etree.HTML( data )
在疯狂的循环中。 (我粗心地忽略了它,但发现我的罪孽得到了救赎,因为我付出了额外两天调试的代价!;)一个有效的崩溃脚本在这里。 http://pastebin.com/0kCPQz3N (还提出了一个新问题。) https://stackoverflow.com/questions/15367001/how-to-prevent-lxml-etree-html-data-from-crashing-on-certain-type-of-data
编辑 6:事实证明这是 lxml 版本 2.7.8 及以下版本的一个错误(位于
至少)。更新至lxml 2.9.0 ftp://xmlsoft.org/libxml2/,bug 就消失了。也感谢这里的好人这个后续问题。 https://stackoverflow.com/questions/15367001/how-to-prevent-lxml-etree-html-data-from-crashing-on-certain-type-of-data
我不知道如何调试我遇到的这个奇怪的问题。
下面的代码可以正常运行大约五分钟,此时 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