У меня есть такой скрипт на 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 ++ увеличивалась с каждым разом, когда я вызывал эту функцию.
После большого количества исследований:
- Запуск Valgrind
- Проверка всех Py_DECREFвсех переменных / PyObjects в моем коде C ++
- Обеспечение того, что мой код не пропускает память в другом месте
- Замена моего необработанного Python-C-API на Boost Python и повторная проверка
Я обнаружил, что память на C ++ увеличивается из-за самого скрипта Python, а не Python-C-API.Я подтвердил это, заменив вышеприведенный скрипт на фиктивный (который не имеет переменных и ничего не делает) и неоднократно вызывал одну и ту же функцию.Память процесса была постоянной и не увеличивалась в этот раз.
Как заставить сборщик мусора Python освобождать все переменные после каждого вызова функции?Я не знаю, если / когда Python GC освободит память.В других ответах stackoverflow я заметил некоторые предложения о том, что принудительно собирать сборщик мусора - плохая вещь.
Как я могу гарантировать, что мой процесс c ++ не будет использовать дополнительную память каждый раз, когда я вызываю pythonскрипт?Это так же просто, как вызывать del () для всех локальных переменных python, которые я объявляю?Или есть какой-то другой способ?
Я также вызываю довольно много функций из импортированного модуля и не знаю, повлияет ли это также на сборку мусора.