2013-03-08 6 views
11

Редактировать: Очень ценю помощь в поиске ошибки - но так как это может оказаться трудно найти/воспроизвести, любая общая помощь отладки будет также очень признательна! Помогите мне помочь себе! =)Как отладить ошибку памяти 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 

enter image description here

+1

Можете ли вы связать HTML-данные, чтобы мы могли также проверить код? – TankorSmash

+0

'data' - это первые 5000 байтов любого HTML-документа. – knutole

+1

Не быть сложным, но вы пробовали его на разных страницах, и неважно, какие данные вы проходите? – TankorSmash

ответ

3

Вы можете попробовать Low-level Python debugging with GDB. Вероятно, есть ошибка в интерпретаторе Python или в библиотеке lxml, и ее трудно найти без дополнительных инструментов.

Вы можете прервать работу своего сценария под управлением gdb, когда загрузка процессора идет на 100% и посмотрите на трассировку стека. Вероятно, это поможет понять, что происходит внутри скрипта.

2

это должно быть из-за некоторые ссылки, которые хранят документы в живых. всегда нужно быть осторожным с строковыми результатами оценки xpath. Я вижу, что вы назначили None на tree и m, но не на y, x и i.

Можете ли вы также назначить None на номер y, x и i.

+0

Спасибо! Просто попробовал. К сожалению, такой же результат. – knutole

+1

Вы пробовали использовать 'del' на всех этих? –

+0

Да, не повезло. Спасибо! Обновленный вопрос. – knutole

2

Инструменты также полезны при поиске проблем с памятью. Я нашел guppy, чтобы быть очень полезным инструментом для профилирования и разведки памяти Python.

Это не самый простой способ начать работу из-за отсутствия хороших учебников/документации, но как только вы справитесь с ним, вы найдете его очень полезным.Особенности Я использую:

  • удаленного профилирования памяти (через сокеты)
  • Basic GUI для построения графиков использования, при необходимости показывать живые данные
  • Мощные и последовательные, интерфейсы для изучения использования данных в Python shell
+0

Спасибо за это. Можете ли вы найти «потерянные» ссылки с помощью этого инструмента? – knutole

+1

@knutole: Да, с некоторым усилием. Вы можете делать снимки состояния памяти (т. Е. До и после предполагаемого триггера для вашей проблемы) и сравнивать их. Таким образом, вы можете видеть только изменения. Оттуда вы можете получить кратчайший путь между глобальной областью и объектом интереса. – RobM

Смежные вопросы