Подтвердить что ты не робот

Как отладить ошибку памяти Python?

Изменить: действительно ценю помощь в поиске ошибки - но поскольку это может оказаться трудно найти/воспроизвести, любая общая помощь отладки будет также очень признательна! Помогите мне помочь себе! =)

Изменить 2: сузить его, комментируя код.

Изменить 3: Кажется, что lxml не может быть виновником, спасибо! Полный script здесь. Мне нужно пойти по ней, ища ссылки. Как они выглядят?

Изменить 4: На самом деле, скрипты останавливаются (идут на 100%) в этой части parse_og. Поэтому edit 3 является ложным - он должен быть lxml каким-то образом.

Изменить 5 ОСНОВНАЯ РЕДАКТИРОВКА: Как было предложено Дэвидом Робинсоном и TankorSmash ниже, я нашел тип data контента, который отправит lxml.etree.HTML( data ) в цикле. (Я беззаботно проигнорировал его, но нашел, что мои грехи искуплены, поскольку я заплатил цену за дополнительные два дня отладки!;) Рабочий сбой script здесь. (Также был открыт новый вопрос.)

Редактировать 6: Оказывается, это ошибка с lxml версии 2.7.8 и ниже (at наименее). Обновлен до lxml 2.9.0, и ошибка исчезла. Спасибо также прекрасным людям в этом последующем вопросе.

Я не знаю, как отлаживать эту странную проблему, с которой я сталкиваюсь. Следующий код работает нормально около пяти минут, когда ОЗУ внезапно полностью заполняется (от 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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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