447 Stimmen

Vom Python-Prozess belegter Gesamtspeicher?

Gibt es eine Möglichkeit für ein Python-Programm zu bestimmen, wie viel Speicher es derzeit verwendet? Ich habe Diskussionen über die Speichernutzung für ein einzelnes Objekt gesehen, aber was ich brauche, ist die Gesamtspeichernutzung für den Prozess, so dass ich feststellen kann, wann es notwendig ist, zu beginnen, zwischengespeicherte Daten zu verwerfen.

12voto

Ihor B. Punkte 1197

Nachfolgend finden Sie meinen Funktionsdekorator, mit dem Sie verfolgen können, wie viel Speicher dieser Prozess vor dem Funktionsaufruf verbraucht hat, wie viel Speicher er nach dem Funktionsaufruf verbraucht und wie lange die Funktion ausgeführt wird.

import time
import os
import psutil

def elapsed_since(start):
    return time.strftime("%H:%M:%S", time.gmtime(time.time() - start))

def get_process_memory():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss

def track(func):
    def wrapper(*args, **kwargs):
        mem_before = get_process_memory()
        start = time.time()
        result = func(*args, **kwargs)
        elapsed_time = elapsed_since(start)
        mem_after = get_process_memory()
        print("{}: memory before: {:,}, after: {:,}, consumed: {:,}; exec time: {}".format(
            func.__name__,
            mem_before, mem_after, mem_after - mem_before,
            elapsed_time))
        return result
    return wrapper

Wenn Sie also eine Funktion mit ihr dekoriert haben

from utils import track

@track
def list_create(n):
    print("inside list create")
    return [1] * n

Sie werden diese Ausgabe sehen können:

inside list create
list_create: memory before: 45,928,448, after: 46,211,072, consumed: 282,624; exec time: 00:00:00

8voto

A.Ametov Punkte 1604

Für Python 3.6 und psutil 5.4.5 ist es einfacher, Folgendes zu verwenden memory_percent() aufgeführte Funktion ici .

import os
import psutil
process = psutil.Process(os.getpid())
print(process.memory_percent())

8voto

Don Kirkby Punkte 46803

Noch einfacher zu bedienen als /proc/self/status : /proc/self/statm . Es ist nur eine durch Leerzeichen getrennte Liste von mehreren Statistik . Ich habe nicht feststellen können, ob beide Dateien immer vorhanden sind.

/proc/[pid]/statm

Liefert Informationen über den Speicher u Die Spalten sind:

  • Größe (1) insgesamt p (dasselbe wie VmSize in /proc/[pid]/status)
  • wohnhaft (2) wohnhaft (gleich wie VmRSS in /proc/[pid]/status)
  • shared (3) Anzahl der residenten gemeinsam genutzten Seiten (d. h., die durch eine Datei gesichert sind) (dasselbe wie RssFile+RssShmem in /proc/[pid]/status)
  • Text (4) Text (Code)
  • lib (5) Bibliothek (unbenutzt seit Linux 2.6; immer 0)
  • Daten (6) Daten + Stapel
  • dt (7) dirty pages (seit Linux 2.6 unbenutzt; immer 0)

Hier ist ein einfaches Beispiel:

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)

Das Ergebnis ist eine Liste, die in etwa so aussieht:

0
0
368640
368640
368640
638976
638976
909312
909312
909312

Sie können sehen, dass sie nach etwa 3 Zuweisungen von 100.000 Bytes um etwa 300.000 Bytes ansteigt.

7voto

Chu-Siang Lai Punkte 2470

Ich mag es , danke für @bayer. Ich bekomme jetzt ein spezifisches Prozesszählwerkzeug.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Fügen Sie meine Prozessliste bei.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Referenz

5voto

Pedro Reis Punkte 1438
import os, win32api, win32con, win32process
han = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION|win32con.PROCESS_VM_READ, 0, os.getpid())
process_memory = int(win32process.GetProcessMemoryInfo(han)['WorkingSetSize'])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X