Задать вопрос
moonz
@moonz
web developer | seo | design

BeautifulSoup4 сжирает оперативную память, что делать?

Целый день бился над вопросом, куда утекает оперативная память, причем буквально тает на глазах. Пока данных было не много, я этого не замечал. Однако решил для теста поработать с большим количеством данных и через несколько минут ноут завис вообще.
Отследил утечку до вызова soup = BeautifulSoup(html, 'html.parser')
Причем вне зависимости от метода его использования (через функцию, или внутри метода класса), эффект от его воздействия всегда одинаково пагубный. Я пытался понять в чём дело, и делал задержки времени до и после вызова, ещё отслеживал потребление памяти после выполнения метода который его задействует. И действительно, по окончанию работу немного RAM высвобождается, но судя по всему сам объект супа застревает.

gc.collect() не помог от слова совсем, где я его только не пробовал пихать (кроме материальных сущьностей =)

Скажу сразу что опыта у меня не много, аж в устроение утечек прям совсем ноль. Читал сегодня простыню на хабре по этому поводу, но в моём случае не помогло.

Возможно ли как-то принудительно выгрузить данные? Или быть можешь это только верхушка айсберга.

p.s Я грешил на экземпляр класса, что возможно именно из-за того что вызов происходит внутри метода класса, есть вероятность что он умирает именно там. И да, я пробовал делать del в конце вызова, никакого результата это не дало.
p.s.s При удалении экземпляра класса, память всё же высвобождается. Но для меня это увы не вариант, так-как нужно передать объект дальше.

Заранее благодарю за любые советы.
  • Вопрос задан
  • 717 просмотров
Подписаться 5 Простой 2 комментария
Решения вопроса 1
sim3x
@sim3x
Используйте lxml без прокладки в виде bs
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
lxsmkv
@lxsmkv
Test automation engineer
Ну вот тут говорят page.decompose() разрушает обьект страницы.
Утечка памяти это когда программа никакой полезной работы не производит, а потребление памяти растет.
Тут я думаю нет утечки, а просто каждый цикл добавляет в память новые данные. И они не удаляются.
Ответ написан
dio4
@dio4
team leader, system engineer, master of sports
Переходите на libxml2 и cython, потому что высоконагруженные проекты не делают на python.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы