Python相当于PHP的memory_get_usage()?

Sha*_*obe 24 python

我已经发现了以下问题,但我想知道是否有一种更快更脏的方法来获取python解释器当前用于我的脚本而不依赖于外部库的内存量的估计.

我来自PHP并且为此目的使用了memory_get_usage()memory_get_peak_usage(),我希望能找到一个等价物.

Mar*_*ler 31

Linux和其他系统的简单解决方案/proc/self/status是以下代码,我在我的项目中使用它:

def memory_usage():
    """Memory usage of the current process in kilobytes."""
    status = None
    result = {'peak': 0, 'rss': 0}
    try:
        # This will only work on systems with a /proc file system
        # (like Linux).
        status = open('/proc/self/status')
        for line in status:
            parts = line.split()
            key = parts[0][2:-1].lower()
            if key in result:
                result[key] = int(parts[1])
    finally:
        if status is not None:
            status.close()
    return result
Run Code Online (Sandbox Code Playgroud)

它返回当前和峰值驻留内存大小(这可能是人们在谈论应用程序使用多少RAM时的意思).很容易扩展它以从/proc/self/status文件中获取其他信息.

对于好奇:完整的输出cat /proc/self/status看起来像这样:

% cat /proc/self/status
Name:   cat
State:  R (running)
Tgid:   4145
Pid:    4145
PPid:   4103
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 32
Groups: 20 24 25 29 40 44 46 100 1000 
VmPeak:     3580 kB
VmSize:     3580 kB
VmLck:         0 kB
VmHWM:       472 kB
VmRSS:       472 kB
VmData:      160 kB
VmStk:        84 kB
VmExe:        44 kB
VmLib:      1496 kB
VmPTE:        16 kB
Threads:        1
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   03
Cpus_allowed_list:      0-1
Mems_allowed:   1
Mems_allowed_list:      0
voluntary_ctxt_switches:        0
nonvoluntary_ctxt_switches:     0
Run Code Online (Sandbox Code Playgroud)

  • 是kb或字节的峰值/驻留? (2认同)

Nat*_*ike 17

您还可以使用getrusage()标准库模块中的函数resource.生成的对象具有属性ru_maxrss,该属性为调用进程提供总峰值内存使用量:

>>> import resource
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656
Run Code Online (Sandbox Code Playgroud)

Python文档不在单位究竟清晰,但Mac OS X的手册页getrusage(2)描述单位千字节.

Linux手册页不清楚,但它似乎等同/proc/self/status于接受的答案中描述的信息(即千字节).对于与上述相同的过程,在Linux上运行,接受的答案中列出的功能给出:

>>> memory_usage()                                    
{'peak': 6392, 'rss': 2656}
Run Code Online (Sandbox Code Playgroud)

这可能不像/proc/self/status解决方案那么容易使用,但它是标准库,所以(如果单位是标准的)它应该是跨平台的,并且可用于缺少的系统/proc/(例如Mac OS X和其他Unix,也许视窗).

此外,getrusage()还可以给出函数resource.RUSAGE_CHILDREN以获取子进程的使用,并且(在某些系统上)resource.RUSAGE_BOTH用于总(自身和子进程)进程使用.

这将涵盖memory_get_usage()案例,但不包括峰值使用情况.我不确定resource模块中的任何其他功能是否可以提供峰值使用.

  • 在我的Ubuntu 11.10机器上,我得到resource.getrusage()是一个更接近memory_usage()的峰值而不是rss的值.你确定ru_maxrss是指当前的内存使用量而不是峰值内存使用量吗? (2认同)

joh*_*odo 10

接受的答案规则,但使用psutil可能更容易(也更便携).它做了同样的事情.

更新:muppy也非常方便(并且比guppy/heapy更好地记录).