Nehmen Sie Ihre eigene maximale Speichernutzung in Linux & Python

Fazit

Ich habe viel gesucht, aber ich konnte keinen besseren Weg finden. Da das Dateisystem / proc verwendet wird, funktioniert es nur auf unterstützten Plattformen (wie Linux).

import os
import re

def peak_memory():
    pid = os.getpid()
    with open(f'/proc/{pid}/status') as f:
        # "VmHWM:    862168 kB"Extrahieren Sie Zeilen im Format
        for line in f:
            if not line.startswith('VmHWM:'):
                continue
            return int(re.search('[0-9]+', line)[0])
    raise ValueError('Not Found')

Warum Spitzenauslastung?

Innerhalb einer bestimmten Funktion trat ein Phänomen auf, bei dem die Speichernutzung vorübergehend zunahm.

Wenn Sie die Funktion profilieren und herausfinden möchten, wo die Speichernutzung zunimmt, sollten Sie Speicherprofiler verwenden. Dieses Mal wusste ich, wo es zunehmen würde, und ich konnte nicht anders, aber ich wollte herausfinden, wie viel es zunehmen würde, also musste ich die Spitzenauslastung kennen.

Was passiert, wenn Sie keine Spitzenauslastung verwenden?

Sie können die aktuelle Speichernutzung mit psutil abrufen. Siehe this.

Es ist jedoch kein Peak, wie zum Beispiel bei einem solchen Code

Nehmen Sie den aktuell verwendeten Speicher


import psutil

def f():
    a = [0] * 20000000

print(psutil.Process().memory_full_info())
f()
print(psutil.Process().memory_full_info())

Das Ergebnis ist wie folgt.

Nicht viel anders


pfullmem(rss=12406784, vms=18395136, shared=6369280, text=4096, lib=0, data=6225920, dirty=0, uss=8134656, pss=9319424, swap=0)
pfullmem(rss=12619776, vms=18354176, shared=6385664, text=4096, lib=0, data=6184960, dirty=0, uss=8253440, pss=9438208, swap=0)

Ich benutze viel Speicher innerhalb von f (), aber ich benutze ihn nicht draußen, also kann ich von außen nichts sagen.

Nimm es in f


import psutil

def f():
    a = [0] * 20000000
    print('inner: ', psutil.Process().memory_full_info())

print('before:', psutil.Process().memory_full_info())
f()
print('after: ', psutil.Process().memory_full_info())

In diesem Fall sieht es so aus:

Ich benutze viel nur in der Mitte


before: pfullmem(rss=12476416, vms=18395136, shared=6443008, text=4096, lib=0, data=6225920, dirty=0, uss=8179712, pss=9407488, swap=0)
inner:  pfullmem(rss=172519424, vms=178356224, shared=6520832, text=4096, lib=0, data=166187008, dirty=0, uss=168300544, pss=169528320, swap=0)
after:  pfullmem(rss=12754944, vms=18354176, shared=6520832, text=4096, lib=0, data=6184960, dirty=0, uss=8298496, pss=9526272, swap=0)

Es wäre schön, wenn ich Code einfügen könnte, der die Speichernutzung genau dort festlegt, wo er anscheinend Speicher verwendet, aber das wollte ich nicht.

Was ist mit dieser Methode passiert?

Nehmen Sie Spitzenauslastung


import os
import re

def peak_memory():
    pid = os.getpid()
    with open(f'/proc/{pid}/status') as f:
        for line in f:
            if not line.startswith('VmHWM:'):
                continue
            return int(re.search('[0-9]+', line)[0])
    raise ValueError('Not Found')

def f():
    a = [0] * 20000000

print('before:', peak_memory(), 'KB')
f()
print('after: ', peak_memory(), 'KB')

Infolgedessen wurde es so.

Steigt danach an


before: 9072 KB
after:  165532 KB

Ich bin glücklich.

Verweise

Messen Sie den Speicherverbrauch von Linux-Programmen

Über den Code

Verwenden Sie den Code in diesem Artikel für Python-Skripte, die von Ihnen oder Ihrem Unternehmen entwickelt wurden.

Recommended Posts

Nehmen Sie Ihre eigene maximale Speichernutzung in Linux & Python
Erstellen Sie Ihre eigenen Linux-Befehle in Python
[Python] Registrieren Sie Ihre eigene Bibliothek in PyPI
Installieren Sie Linux auf Chromebox
Überwachen Sie die Festplattennutzung unter Linux
Installieren Sie Python Pillow unter Amazon Linux
[Python] Erstelle deinen eigenen LINE-Bot
Machen Sie Ihr eigenes Handbuch. [Linux] [Mann]
[Python] Anmelden Ihres eigenen Moduls
Versuchen Sie, k-NN selbst zu implementieren
Anzeigen der Festplattennutzung unter Linux
Führen Sie die Python 3.5.2-Umgebung unter Amazon Linux ein
python> os.path.join ('data', 'checkpoint')> 'data / checkpoint' unter Linux
Load_data wurde selbst erstellt, um Python MNIST-Beispielcode in Ihrem eigenen Dataset auszuführen
Installieren Sie Python3 und Django unter Amazon Linux (EC2) und führen Sie den Webserver aus
[LLDB] Erstellen Sie Ihren eigenen Befehl mit Python
Suchen Sie nach Dateien wie Linux Find in Python
Verwenden Sie einfach Ihre eigenen Funktionen in Python
Erstellen Sie eine Python-Umgebung auf Ihrem Mac
[Python] Packen und verteilen Sie Ihre eigenen Module
Hinweis zum Erstellen einer eigenen Miniconda-Umgebung
[C] [Python] Lesen mit AquesTalk unter Linux
Grundlegende Verwendung von Btrfs in Arch Linux
Wenn Sie sich die Speichernutzung in Python 3 ansehen
Bis Sie Ihre eigene Python-Bibliothek installieren
5 Gründe, Linux auf Ihrem Laptop zu installieren.
Importieren Sie Ihre eigenen Funktionen mit AWS Glue
Docker-Datei: Installieren Sie Docker auf einem Linux-Server
Veröffentlichen Sie Ihre eigene Python-Bibliothek auf Homebrew
Installieren Sie Python 3.8, Pip 3.8 auf EC2 (Amazon Linux 2)
Holen Sie sich Ihre eigene IP-Adresse in Python
[Python] Implementieren Sie Ihre eigene listenähnliche Klasse mit collection.UserList
Linux C / C ++ Erstellen Sie Ihre eigene Bibliothekserstellungsumgebung
Erstellen Sie schnell Ihr eigenes Modul mit setuptools (Python)
Erstellen Sie eine Python-Entwicklungsumgebung auf Ihrem Mac
So laden Sie einfach CPU / Speicher unter Linux
Importieren Sie Ihre eigenen Module mit der Python-Entwicklung von Grasshopper
Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray