Устанавливает ли numpy массивы None свободной памяти?

У меня есть сотни действительно больших матриц, таких как (600, 800) или (3, 600, 800) формальных.

Поэтому я хочу отменить выделение памяти, как только мне больше ничего не нужно.

Я подумал:

some_matrix = None

Должно ли выполняться задание или это только ссылка, установленная на None, но где-то в памяти, которую все еще выделяет пространство? (например, сохранение выделенного пространства для некоторой повторной инициализации some_matrix в будущем)

Дополнительно: иногда я просматриваю матрицы, вычисляю что-то и помещаю значения в буфер (список, потому что он все время добавляется). Таким образом, установка списка в None, безусловно, освободит память, верно?

Или существует какой-то метод unset(), где целые идентификаторы плюс его ссылочные объекты "удалены"?

Ответ 1

Вы определенно хотите посмотреть сбор мусора. В отличие от некоторых языков программирования, таких как C/C++, когда программист должен самостоятельно освобождать динамически выделенную память, когда пространство больше не требуется, python имеет сбор мусора. Это означает, что сам python освобождает память при necessary.

Когда вы используете some_matrix = None, вы отсоединяете переменную из памяти; счетчик ссылок уменьшается, и если он достигает 0, сборщик мусора освободит память. Когда вы используете del some_matrix, как было предложено MSeifert, память не освобождается сразу же, в отличие от того, что говорит ответ. Согласно python doc, вот что происходит:

Удаление имени удаляет привязку этого имени из локального или глобального пространства имен

Что происходит под капотом, так это то, что счетчик ссылок на пространство памяти уменьшается на 1 независимо от назначения None или использования del. Когда этот счетчик достигнет 0, сборщик мусора в будущем будет free. Единственное различие заключается в том, что при использовании del из контекста ясно, что вам больше не нужно имя.

Если вы посмотрите на документ сборки мусора, вы увидите, что вы можете вызвать его самостоятельно или изменить некоторые его параметры.

Ответ 2

Numpy удаляет массивы, когда опорный счетчик равен нулю (или, по крайней мере, он отслеживает контрольный счетчик и позволяет ОС собирать мусор).

Например, имея

import numpy as np
a = np.linspace(0,100, 10000000)
a = None

освободит память "немедленно" (предпочтительный способ писать del a хотя), а

import numpy as np
a = np.linspace(0,100, 10000000)
b = a
a = None

ничего не освободит.


Вы упомянули также нарезку. Нарезка - это просто представление о данных и, следовательно, точно так же, как и второй пример. Если вы не удалите обе переменные, которые ссылаются на один и тот же массив, OS будет хранить массивы.

Если я делаю что-то очень дорогое, я всегда буду придерживаться отдельных функций, выполняющих операцию, и возвращать только то, что действительно необходимо. Функции очищаются после себя, поэтому любые промежуточные результаты освобождаются (если они не возвращаются).

Ответ 3

В случае, если вам нужно сделать что - то вроде ниже память не будет освобождена, хотя копия будет неявно: a

a = np.ones((10000, 10000))
b = np.empty((10000, 10000))
b[:] = a
a = None
del a

Вместо этого вы можете сделать следующее, и память будет освобождена после выполнения a = None:

a = np.ones((10000, 10000))
b = np.empty((10000, 10000))
b[:] = np.copy(a)
a = None
del a