K
K
Kevin Mitnick2017-01-09 21:14:33
Python
Kevin Mitnick, 2017-01-09 21:14:33

Why is memory not freed in python?

Hello.
On python 3, there is the following function (only part of it, there is no particular point in giving the second part so as not to confuse anyone):

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 начал изучать буквально пару дней назад, прошу сильно не кидать камнями, если глупость где-то написал или сморозил.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
K
Kevin, 2017-01-09
@volfing

After I rewrote the recursive function call to call the same function in an infinite loop, the memory stopped escaping in such volumes =)
Thanks for the help, Pavel Denisov

R
Roman Mindlin, 2017-01-09
@kgbplus

What if we try to move the memory-consuming code into a separate function?

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

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question