Редактировать: Очень ценю помощь в поиске ошибки - но так как это может оказаться трудно найти/воспроизвести, любая общая помощь отладки будет также очень признательна! Помогите мне помочь себе! =)Как отладить ошибку памяти Python?
Редактировать 2: сузить его, прокомментировав код.
Редактировать 3: Кажется, lxml не может быть преступником, спасибо! Полный скрипт - here. Мне нужно пойти по ней, ища ссылки. На что они похожи?
Edit 4: На самом деле, сценарии останавливается (выходит на 100%) в этом,parse_og
часть его. Таким образом, редактирование 3 является ложным - оно должно быть как-то как lxml.
Edit 5 MAJOR EDIT: Как было предложено Дэвид Робинсон и TankorSmash ниже, я нашел тип data
контента, который будет посылать lxml.etree.HTML(data)
в диком цикле. (Я небрежно игнорировать его, но найти мои грехи искуплены, как я заплатил цену в размере двух дополнительных дней отладки;!) A working crashing script is here.(Also opened a new question.)
Edit 6: Оказывается, это ошибка с lxml версии 2.7.8 и ниже (в наименее). Updated to lxml 2.9.0, и ошибка исчезла. Спасибо также прекрасным людям за this follow-up question.
Я не знаю, как отлаживать эту странную проблему, с которой я сталкиваюсь. Приведенный ниже код работает нормально около пяти минут, когда ОЗУ внезапно полностью заполняется (от 200 МБ до 1700 МБ в течение 100% периода, а затем, когда память заполнена, он переходит в состояние синего ожидания).
Это из-за кода ниже, в частности, первых двух строк. Это уж точно. Но что происходит? Что может объяснить это поведение?
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
Можете ли вы связать HTML-данные, чтобы мы могли также проверить код? – TankorSmash
'data' - это первые 5000 байтов любого HTML-документа. – knutole
Не быть сложным, но вы пробовали его на разных страницах, и неважно, какие данные вы проходите? – TankorSmash