Python не освобождает память, когда переменная выходит из области видимости - PullRequest
0 голосов
/ 25 апреля 2018

Когда я инициализирую массив Numpy внутри функции, Python не освобождает память после возврата из функции, как показано в примере кода ниже. Есть ли способ освободить эту память? Использование gc.collect () не сработало, и та же проблема возникает и в Python2 и Python3.

import numpy as np
import resource

def function():
    x = np.random.random([10000, 10000])

print('Memory usage: %s (kb)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)

function()

print('Memory usage: %s (kb)'% resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)

Вывод кода:
Использование памяти: 20560 (КБ)
Использование памяти: 801832 (КБ)

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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.На данный момент текущее использование - это новый максимум, поэтому оба значения совпадают.

После того, как мы покидаем функцию, наше текущее использование падает примерно до того уровня, которое было до того, как мы вошли в функцию.

0 голосов
/ 25 апреля 2018

Python может не выпускать сборочную память для ОС.Это может сохранить уже выделенную память для будущего использования.Это не значит, что произошла утечка памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...