Python фактически освобождает память, как только функция завершается.Проблема здесь в том, что значение, которое вы печатаете, resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
, говорит вам о пике или max использовании памяти.
Чтобы получить текущее использование памяти , вы можете попробовать пакет psutil
($ pip install psutil
).Это кроссплатформенная утилита, предоставляющая вам информацию, например, текущее использование памяти.
Попробуйте этот измененный фрагмент:
import numpy as np
import resource
import os
import psutil
process = psutil.Process(os.getpid())
def my_function():
print('### Starting function ###')
print('Max Memory usage: %s (KB)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)' % (process.memory_info().rss / 1024))
print('doing stuff...')
x = np.random.random([10000, 10000])
print('Max Memory usage: %s (KB)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)' % (process.memory_info().rss / 1024))
print('#### Ending function ####')
print('Max Memory usage: %s (KB)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)'% (process.memory_info().rss/ 1024))
my_function()
print('Max Memory usage: %s (KB)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('Curr Memory usage: %s (KB)'% (process.memory_info().rss / 1024))
На моем компьютере выведите:
Max Memory usage: 714588 (KB)
Curr Memory usage: 26884.0 (KB)
### Starting function ###
Max Memory usage: 714588 (KB)
Curr Memory usage: 26884.0 (KB)
doing stuff...
Max Memory usage: 808380 (KB)
Curr Memory usage: 808380.0 (KB)
#### Ending function ####
Max Memory usage: 808380 (KB)
Curr Memory usage: 27132.0 (KB)
К тому моменту, когда мы приступим к первой проверке памяти, она уменьшится до 26 МБ, но в какой-то момент она уже достигла 714 МБ при запуске или импорте библиотек.
В начале функцииэто то же самое, но к концу нашей функции мы достигли нового максимума с помощью numpy.На данный момент текущее использование - это новый максимум, поэтому оба значения совпадают.
После того, как мы покидаем функцию, наше текущее использование падает примерно до того уровня, которое было до того, как мы вошли в функцию.