Переменные не получают мусор, приводящий к увеличению памяти процесса C ++ - PullRequest
0 голосов
/ 16 октября 2018

У меня есть такой скрипт на Python:

import module
globalvariable a
def read(key):
    x = funcA(a, key)
    ret = funcB(x)
    if ret == True:
        return "Success"
    else:
        return "Failure"

Я периодически вызываю эту функцию из моей программы на C ++ через Python-C-API.Я заметил, что моя память процесса C ++ увеличивалась с каждым разом, когда я вызывал эту функцию.

После большого количества исследований:

  1. Запуск Valgrind
  2. Проверка всех Py_DECREFвсех переменных / PyObjects в моем коде C ++
  3. Обеспечение того, что мой код не пропускает память в другом месте
  4. Замена моего необработанного Python-C-API на Boost Python и повторная проверка

Я обнаружил, что память на C ++ увеличивается из-за самого скрипта Python, а не Python-C-API.Я подтвердил это, заменив вышеприведенный скрипт на фиктивный (который не имеет переменных и ничего не делает) и неоднократно вызывал одну и ту же функцию.Память процесса была постоянной и не увеличивалась в этот раз.

Как заставить сборщик мусора Python освобождать все переменные после каждого вызова функции?Я не знаю, если / когда Python GC освободит память.В других ответах stackoverflow я заметил некоторые предложения о том, что принудительно собирать сборщик мусора - плохая вещь.

Как я могу гарантировать, что мой процесс c ++ не будет использовать дополнительную память каждый раз, когда я вызываю pythonскрипт?Это так же просто, как вызывать del () для всех локальных переменных python, которые я объявляю?Или есть какой-то другой способ?

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

...