Как освободить массив numpy?

Я хочу удалить весь массив numpy. Например, если я создаю массив A как

A = np.zeros((2,3))

Я хочу удалить весь массив A и хочу повторно использовать имя «A» в других целях.

Есть ли коды (функции) для удаления массива?


person Philjoon Jung    schedule 11.05.2018    source источник
comment
Python — это язык с управлением памятью, и объекты автоматически восстанавливаются, когда их счетчик ссылок достигает нуля.   -  person juanpa.arrivillaga    schedule 11.05.2018
comment
@juanpa.arrivillaga ... за исключением того, что numpy на самом деле не является python и не обязательно работает таким образом   -  person Jivan    schedule 12.06.2020
comment
@ Дживан да, это так. И да, это так.   -  person juanpa.arrivillaga    schedule 12.06.2020
comment
ну попробуй del my_numpy_array_taking_50gb_in_memory и посмотри что будет в htop потом — память все же выделена   -  person Jivan    schedule 12.06.2020
comment
@Jivan прочитал следующее: stackoverflow.com/questions/15455048/releasing- память-в-питоне   -  person juanpa.arrivillaga    schedule 12.06.2020
comment
@Jivan, а также это: stackoverflow.com/questions/18310668/   -  person juanpa.arrivillaga    schedule 12.06.2020


Ответы (2)


Я хочу удалить весь массив A

Легко :

del A

хотите повторно использовать имя "А" в других целях.

Так же легко:

A = whateverElse  # associate A with whateverElse, so simple :o)
person user3666197    schedule 11.05.2018
comment
это не освобождает память. каким-то образом массив продолжает быть привязанным к памяти (хотя переменная больше недоступна) - person Jivan; 12.06.2020
comment
@Jivan - конечно, такие случаи возможны. Вы можете протестировать A.flags, прежде чем выполнять del A, чтобы увидеть больше деталей. Numpy использует интеллектуальные структуры для хранения и обработки векторных/матричных/тензорных данных. Некоторые даже не владеют своими собственными данными и являются просто облегченным считывателем-помощником в данных другого numpy-объекта, поэтому удаление такого не-владельца по очевидным причинам удалит только lightqweight-reader-helper, а не толстый-(_иностранный по принадлежности_)-данные< /b> себя. - person user3666197; 12.06.2020
comment
есть идеи, как в этих случаях освободить память от толстых данных? - person Jivan; 12.06.2020
comment
@Jivan в Python нет способа явно освободить память - person juanpa.arrivillaga; 12.06.2020
comment
@juanpa.arrivillaga означает ли это, что если мы создадим массив размером 50 ГБ в памяти и del не освободим его, то нет другого способа освободить эту память, кроме как убить процесс? - person Jivan; 12.06.2020
comment
@Jivan Да, по существу. Теперь вы должны понимать, что на самом деле память может быть свободна для использования процессом в других объектах Python... Это высокая отметка. Таким образом, объект может быть освобожден, но ваш процесс все еще использует память из POV операционной системы. Также важно понимать, что del ничего не освобождает, он удаляет переменную, которая может или не может привести к тому, что счетчик ссылок достигнет 0 (что в CPython приводит к немедленному восстановлению объекта) - person juanpa.arrivillaga; 12.06.2020
comment
на самом деле память может быть свободна для использования процессом на других объектах python — я бы предпочел поверить вам на слово, но, к сожалению, это не то, что я наблюдаю — как только я выделяю массив размером 50 ГБ, эти 50 ГБ теряются навсегда, пока процесс запущен (это тоже очень раздражает, поэтому, если у вас есть решение для этого, я был бы рад выслушать) - person Jivan; 12.06.2020

Просто назначьте A чему-то другому. Как сказал @juanpa.arrivillaga, Python позаботится о массиве, на который теперь нет ссылок, и сам выполнит любую сборку мусора.
например. A = "new string"

person Caders117    schedule 11.05.2018