У меня есть код, похожий на этот:
def memoryIntensiveFunction(x):
largeTempVariable = Intermediate(x)
processFunction(largeTempVariable,x)
Проблема в том, что переменная temp
составляет около 500 МБ в моем тестовом примере, но это пространство не возвращается в ОС, когда memoryIntensiveFunction
завершается. Я знаю это, потому что профилирование памяти с помощью инструмента guppy
говорит, что largeTempVariable
освобождено (т. е. внутри Python), но psutil
показывает, что это не так. Я предполагаю, что вижу эффекты, описанные здесь. Проблема в том, что этот процесс идет долго (т.е. часы), memoryIntensiveFunction
запускается в начале и больше никогда, поэтому мне неудобно таскать 500мб часами.
Одно решение я нашел здесь и здесь предлагается использовать отдельный процесс. Многопроцессорность требует собственных затрат, но в моем случае это того стоило. Однако для этого потребуется рефакторинг вызывающих memoryIntensiveFunction
объектов, чтобы они получали x
в качестве возвращаемого значения, а не видели его измененным на месте. Настоящим убийцей является то, что мой объект x
не поддается выборке (он активно использует расширения boost python). Потребовалось бы много работы, чтобы сделать x
пригодным для травления.
Есть варианты, которые я не рассматриваю?