динамическое выделение памяти в Python
Я создал большой многомерный массив M
с np.zeros((1000,1000))
. После определенного количества операций он мне больше не нужен. Как динамически освободить ОЗУ во время выполнения программы? Делает M=0
сделать это для меня?
3 ответов
на общие вы не можете. Даже если вы удалите все ссылки на объект, для повторного использования или освобождения памяти остается реализация python. На CPython вы можете позвонить gc.collect()
чтобы принудительно запустить сборку мусора. Но хотя это может вернуть память, это не обязательно возвращает ее в ОС.
но: numpy-это модуль расширения, который делает свое дело и управляет собственной памятью.
когда я контролирую использование памяти процесса python, я вижу использование ОЗУ (размер резидентного набора) после 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 не владеет памятью, и освобождение его оставлено другой библиотеке.
использовать дель о себе:
del M
и, кстати, a float64
массив формы (1000, 1000)
занимает всего 7 Мб. Если у вас проблемы с памятью, скорее всего, проблема в другом месте.
есть два способа.......
1). дель м
But it will delete the array object it self.
2). M. clear ()
you can clear the array without deleting M object