Вопрос-Ответ

Total memory used by Python process?

Общая память, используемая процессом Python?

Есть ли способ для программы на Python определить, сколько памяти она использует в данный момент? Я видел обсуждения об использовании памяти для одного объекта, но что мне нужно, так это общее использование памяти для процесса, чтобы я мог определить, когда необходимо начать удаление кэшированных данных.

Переведено автоматически
Ответ 1

Здесь представлено полезное решение, которое работает для различных операционных систем, включая Linux, Windows и т.д.:

import os, psutil
process = psutil.Process()
print(process.memory_info().rss) # in bytes

Примечания:


  • делать pip install psutil, если он еще не установлен



  • удобный однострочник, если вы хотите быстро узнать, сколько МБАЙТ занимает ваш процесс:


    import os, psutil; print(psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2)


  • с 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, как описано в других ответах на этот вопрос и на этот тоже.

Ответ 3

В Windows вы можете использовать WMI (домашняя страница, cheeseshop):

def memory():
import os
from wmi import WMI
w = WMI('.')
result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid())
return int(result[0].WorkingSet)

В Linux (из python cookbook http://code.activestate.com/recipes/286222 /:

import os
_proc_status = '/proc/%d/status' % os.getpid()

_scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0}

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:
return 0.0 # non-Linux?
# get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
i = v.index(VmKey)
v = v[i:].split(None, 3) # whitespace
if len(v) < 3:
return 0.0 # invalid format?
# convert Vm value to bytes
return float(v[1]) * _scale[v[2]]

def memory(since=0.0):
'''Return memory usage in bytes.'''
return _VmB('VmSize:') - since

def resident(since=0.0):
'''Return resident memory usage in bytes.'''
return _VmB('VmRSS:') - since

def stacksize(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 - это некоторый идентификатор процесса. Также результат указан в МБ.

python