Total memory used by Python process?

前端 未结 12 706
眼角桃花
眼角桃花 2020-11-22 04:28

Is there a way for a Python program to determine how much memory it\'s currently using? I\'ve seen discussions about memory usage for a single object, but what I need is tot

12条回答
  •  醉酒成梦
    2020-11-22 04:33

    Even easier to use than /proc/self/status: /proc/self/statm. It's just a space delimited list of several statistics. I haven't been able to tell if both files are always present.

    /proc/[pid]/statm

    Provides information about memory usage, measured in pages. The columns are:

    • size (1) total program size (same as VmSize in /proc/[pid]/status)
    • resident (2) resident set size (same as VmRSS in /proc/[pid]/status)
    • shared (3) number of resident shared pages (i.e., backed by a file) (same as RssFile+RssShmem in /proc/[pid]/status)
    • text (4) text (code)
    • lib (5) library (unused since Linux 2.6; always 0)
    • data (6) data + stack
    • dt (7) dirty pages (unused since Linux 2.6; always 0)

    Here's a simple example:

    from pathlib import Path
    from resource import getpagesize
    
    PAGESIZE = getpagesize()
    PATH = Path('/proc/self/statm')
    
    
    def get_resident_set_size() -> int:
        """Return the current resident set size in bytes."""
        # statm columns are: size resident shared text lib data dt
        statm = PATH.read_text()
        fields = statm.split()
        return int(fields[1]) * PAGESIZE
    
    
    data = []
    start_memory = get_resident_set_size()
    for _ in range(10):
        data.append('X' * 100000)
        print(get_resident_set_size() - start_memory)
    

    That produces a list that looks something like this:

    0
    0
    368640
    368640
    368640
    638976
    638976
    909312
    909312
    909312
    

    You can see that it jumps by about 300,000 bytes after roughly 3 allocations of 100,000 bytes.

提交回复
热议问题