Почему в python не освобождается память?

Всем привет.

На python 3 есть следующая функция (только ее часть, вторую часть особо смысла приводить нет дабы никого не путать):

def checkNewProjects(link, last_project, timeout, config, session):
	"""Function for check new projects and for restarting timer event"""
	time.sleep(timeout)#Wait pause before start parsing
	print("Checking projects")
	if last_project == "": #It is first launch of function. Need only find last project.
		request = session.get(link).text
		html = BeautifulSoup(request, "html.parser")
		last_project = html.select(".projects .proj")[0].select("h2 a")[0]["href"] #finding link of last project for save
		del request, html
		checkNewProjects(link, last_project, timeout, config, session)
		return


Данный кусок кода после выполнения съедает около 800кб оперативки (вычислялось неоднократными тестами), ниже данных строк выполняются примерно такие же операции и также через del пытаюсь очистить память, но это не особо помогает. Функция постоянно вызывает саму себя пока принудительно не завершить приложение. Хотелось бы узнать:
1. Как избежать потери таких объемов памяти за столь короткие промежутки времени ?
2. Очищает ли del память или просто обнуляет переменные ?
3. Выполнится ли когда-нибудь код, который идет после вызова функции (то есть return) ?
4. Что именно вызывает утечку памяти ?

Я полагаю, что рекурсивный вызов съедает оперативку и функция постоянно ждет пока завершится ее child и так до бесконечности, но не уверен в этом да и довольно большой объем памяти уходит, если учитывать то, что в функцию передаются переменные довольного малого объема.

PS: Пробовал еще через gc принудительно собирать мусор (gc.collect()), но это тоже не дало ожидаемых результатов

PSS: Python начал изучать буквально пару дней назад, прошу сильно не кидать камнями, если глупость где-то написал или сморозил.
  • Вопрос задан
  • 2075 просмотров
Решения вопроса 1
volfing
@volfing Автор вопроса
После того, как переписал рекурсивный вызов функции на вызов этой же самой функции в бесконечном цикле - память перестала улетучиваться в таких объемах =)
Спасибо за помощь, Pavel Denisov
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kgbplus
Что, если попробовать вынести жрущий память код в отдельную функцию?

def memoryEater():
  """eats memory"""
    request = session.get(link).text
    html = BeautifulSoup(request, "html.parser")
    return html.select(".projects .proj")[0].select("h2 a")[0]["href"] #finding link of last project for save

def checkNewProjects(link, last_project, timeout, config, session):
  """Function for check new projects and for restarting timer event"""
  time.sleep(timeout)#Wait pause before start parsing
  print("Checking projects")
  if last_project == "": #It is first launch of function. Need only find last project.
    last_project = memoryEater()
    checkNewProjects(link, last_project, timeout, config, session)
    return
Ответ написан
Ваш ответ на вопрос

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

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