2013-04-30 3 views
6

Я создал большой многомерный массив M с np.zeros((1000,1000)). После определенного количества операций мне это больше не нужно. Как я могу освободить оперативную память динамически во время выполнения программы? M=0 сделайте это для меня?динамическое распределение памяти в python

+2

'M = 0' удалит ссылку, как и' del M', и если бы это была единственная ссылка, она должна быть немедленно освобождена. – Aya

+0

Я отслеживаю память, и я вижу, что M = 0 не влияет на память. Вот почему я спрашиваю. – freude

+1

'del M' также лучше IMHO, так как' M' больше не загрязняет пространство имен your'e in. – StoryTeller

ответ

12

общий вы не можете. Даже если вы удалите все ссылки на объект, для реализации python остается возможность повторно использовать или освобождать память. На CPython вы можете позвонить gc.collect(), чтобы принудительно запустить сборку мусора. Но в то время как это может вернуть память, это не обязательно возвращает его ОС.

Но: numpy - это модуль расширения, который выполняет свою собственную работу и управляет собственной памятью.

Когда я контролировать использование памяти процесса питона, я вижу использование оперативной памяти (Resident Set Size) спускаясь после del(M)

In [1]: import numpy as np 

In [2]: M = np.zeros((1000,1000)) 

In [3]: del(M) 

In [4]: 

Сразу после запуска IPython:

slackbox:~> ps -u 77778 
USER  PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND 
rsmith 77778 0.0 0.5 119644 22692 0 S+ 2:37PM 0:00.39 /usr/local/bin/py 

После импорта numpy (1):

slackbox:~> ps -u 77778 
USER  PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND 
rsmith 77778 1.0 0.8 168548 32420 0 S+ 2:37PM 0:00.49 /usr/local/bin/py 

После создания массива (2):

slackbox:~> ps -u 77778 
USER  PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND 
rsmith 77778 0.0 1.0 176740 40328 0 S+ 2:37PM 0:00.50 /usr/local/bin/py 

После вызова del (3):

slackbox:~> ps -u 77778 
USER  PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND 
rsmith 77778 0.0 0.8 168548 32496 0 S+ 2:37PM 0:00.50 /usr/local/bin/py 
slackbox:~> 

Так в этом случае с использованием del() может уменьшить объем памяти, используемый.

Обратите внимание, что существует исключение с помощью numpy. Numpy может использовать память, выделенную другой библиотекой расширений. В этом случае объект numpy отмечен как numpy не владеет памятью, а освобождение остается в другой библиотеке.

+0

Благодарим за ответ – freude

0

Существует два пути .......

1). del M

 But it will delete the array object it self. 

2). M.clear()

 you can clear the array without deleting M object 
+0

Второй способ - это именно то, что я ищу. Спасибо – freude

+0

А с каких пор существует такая вещь, как ясный метод? – seberg

+1

Нет, clear() не существует с массивом numpy – freude

3

Используйте del заявление:

del M 

И кстати, float64 массив формы (1000, 1000) занимает всего 7 Мб. Если у вас проблемы с памятью, вероятно, проблема в другом месте.

Смежные вопросы