#python #beautifulsoup #memory-leaks #python-requests
#python #beautifulsoup #утечки памяти #python-запросы
Вопрос:
Я считаю, что эта тема была популярна раньше и до сих пор остается проблемой.
Теперь мне удалось создать небольшой скрипт, который может четко видеть утечку памяти и то, что объем памяти будет медленно увеличиваться со временем, и чем больше запросов вы выполняете, тем больше памяти будет использоваться, даже если они не используются.
Скрипт:
import gc
import cloudscraper
from bs4 import BeautifulSoup as soup
scraper = cloudscraper.create_scraper(
browser={
'browser': 'chrome',
'mobile': True,
'platform': 'android'
}
)
response = scraper.get(
'http://www.smetana.net/',
timeout=20
)
if response.ok:
bs4 = soup(response.text, 'lxml')
response.close()
bs4.decompose()
bs4 = None
gc.collect()
return payload
и ниже вы можете увидеть результат:
В приведенном мною примере, который отмечен синим цветом, вы можете ясно видеть, что после выполнения запроса он будет освобожден из памяти, что сэкономит нам использование памяти (я полагаю, также нет смысла хранить его в памяти?) и всякий раз, когда вы используете beautifulsoup. Вы можете видеть, что он увеличивается на 1 МБ. Это может показаться не очень большим, но это может быть более 1 МБ, иногда 2 МБ, что только при более длительном запуске скрипта будет потреблять намного больше использования.
Я читал много потоков из stackoverflow с другим решением, таким как gc.collet, bs4 = None, response.close() и т. Д. И т. Д., Но, как вы можете видеть, ничего не изменилось, и 1 МБ все еще находится в памяти, даже если он никогда не будет использоваться после возврата.
На данный момент я понятия не имею, что еще я могу сделать, чтобы иметь возможность очистить память после использования Beautifulsoup. Что вы, ребята, предлагаете?
Комментарии:
1. Может быть, вы можете запустить код, который пропускает память,
subprocess
и позволить ОС освободить память.2. @AndrejKesely я не совсем понимаю. Как я смогу это сделать и как это поможет?
3. Вы можете запустить
out = subprocess.check_output(["script_that_runs_bs4", "url"])
, и уout
вас есть выходные данные из скрипта. ОС восстановит память, выделенную скриптом.4. @AndrejKesely Я не уверен, действительно ли это поможет, но я могу попробовать. Есть ли какая-либо информация, которую я могу видеть при распечатке
out
?5. У
out
вас есть информация, которую вы хотели получить изurl
(с помощьюbs4
этой утечки памяти). Но вы используетеbs4
внутриscript_that_runs_bs4
, и ОС освободит всю память, когда она закончится.