Есть ли способ для программы на Python определить, сколько памяти она использует в данный момент? Я видел обсуждения об использовании памяти для одного объекта, но что мне нужно, так это общее использование памяти для процесса, чтобы я мог определить, когда необходимо начать удаление кэшированных данных.
Переведено автоматически
Ответ 1
Здесь представлено полезное решение, которое работает для различных операционных систем, включая Linux, Windows и т.д.:
import os, psutil process = psutil.Process() print(process.memory_info().rss) # in bytes
Примечания:
делать pip install psutil, если он еще не установлен
удобный однострочник, если вы хотите быстро узнать, сколько МБАЙТ занимает ваш процесс:
с Python 2.7 и psutil 5.6.3 это было process.memory_info()[0] вместо этого (позже в API произошли изменения).
Ответ 2
Для систем на базе Unix (Linux, Mac OS X, Solaris) вы можете использовать getrusage() функцию из модуля стандартной библиотеки resource. Результирующий объект имеет атрибут ru_maxrss, который определяет максимальное использование памяти вызывающим процессом:
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 2656# peak memory usage (kilobytes on Linux, bytes on OS X)
В документах Python не указаны единицы измерения. Обратитесь к man getrusage.2 странице вашей конкретной системы, чтобы проверить значение единицы измерения. В Ubuntu 18.04 единица измерения обозначается как килобайты. В Mac OS X это байты.
Также может быть задана getrusage() функция resource.RUSAGE_CHILDREN для получения данных об использовании дочерних процессов и (в некоторых системах) resource.RUSAGE_BOTH для общего использования (собственного и дочернего) процесса.
Если вас интересует только Linux, вы можете в качестве альтернативы прочитать файл /proc/self/status or/proc/self/statm, как описано в других ответах на этот вопрос и на этот тоже.
defmemory(): import os from wmi import WMI w = WMI('.') result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid()) returnint(result[0].WorkingSet)
def_VmB(VmKey): '''Private.''' global _proc_status, _scale # get pseudo file /proc/<pid>/status try: t = open(_proc_status) v = t.read() t.close() except: return0.0# non-Linux? # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' i = v.index(VmKey) v = v[i:].split(None, 3) # whitespace iflen(v) < 3: return0.0# invalid format? # convert Vm value to bytes returnfloat(v[1]) * _scale[v[2]]
defmemory(since=0.0): '''Return memory usage in bytes.''' return _VmB('VmSize:') - since
defresident(since=0.0): '''Return resident memory usage in bytes.''' return _VmB('VmRSS:') - since
defstacksize(since=0.0): '''Return stack size in bytes.''' return _VmB('VmStk:') - since
Ответ 4
В unix вы можете использовать ps инструмент для его мониторинга:
$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'
где 1347 - это некоторый идентификатор процесса. Также результат указан в МБ.