BeautifulSoup4 сжирает оперативную память, что делать?
Целый день бился над вопросом, куда утекает оперативная память, причем буквально тает на глазах. Пока данных было не много, я этого не замечал. Однако решил для теста поработать с большим количеством данных и через несколько минут ноут завис вообще.
Отследил утечку до вызова soup = BeautifulSoup(html, 'html.parser')
Причем вне зависимости от метода его использования (через функцию, или внутри метода класса), эффект от его воздействия всегда одинаково пагубный. Я пытался понять в чём дело, и делал задержки времени до и после вызова, ещё отслеживал потребление памяти после выполнения метода который его задействует. И действительно, по окончанию работу немного RAM высвобождается, но судя по всему сам объект супа застревает.
gc.collect() не помог от слова совсем, где я его только не пробовал пихать (кроме материальных сущьностей =)
Скажу сразу что опыта у меня не много, аж в устроение утечек прям совсем ноль. Читал сегодня простыню на хабре по этому поводу, но в моём случае не помогло.
Возможно ли как-то принудительно выгрузить данные? Или быть можешь это только верхушка айсберга.
p.s Я грешил на экземпляр класса, что возможно именно из-за того что вызов происходит внутри метода класса, есть вероятность что он умирает именно там. И да, я пробовал делать del в конце вызова, никакого результата это не дало.
p.s.s При удалении экземпляра класса, память всё же высвобождается. Но для меня это увы не вариант, так-как нужно передать объект дальше.
одно точно при парсинге большого объема, очень хороший прирост скорости именно на чистом lxml, меня учили пользоваться bs4, до сих пор не понимаю, почему везде пытаются учить именно с bs4
Игорь Статкевич, я последователь Олега Молчанова)) сегодня буду делать реализацию на lxml, отмечу данный вариант решением если всё получится. (очень надеюсь что получится)
Ну вот тут говорят page.decompose() разрушает обьект страницы.
Утечка памяти это когда программа никакой полезной работы не производит, а потребление памяти растет.
Тут я думаю нет утечки, а просто каждый цикл добавляет в память новые данные. И они не удаляются.
Очень надеялся что сработает но увы, комбинировал даже с gc.collect(), но результат тот же. Просто накапливается. Даже запарился и написал внешнюю функцию которая собирала сразу в себя, но всё равно остаётся мусор в памяти. Видимо всё же предаётся поменять реализацию.