Prenez votre propre utilisation maximale de la mémoire sous Linux et Python

Conclusion

J'ai beaucoup cherché, mais je n'ai pas trouvé de meilleur moyen. Comme il utilise le système de fichiers / proc, il ne fonctionne que sur les plates-formes supportées (comme Linux).

import os
import re

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

Pourquoi une utilisation de pointe?

À l'intérieur d'une certaine fonction, un phénomène s'est produit dans lequel l'utilisation de la mémoire a temporairement augmenté.

Si vous souhaitez profiler la fonction et découvrir où l'utilisation de la mémoire augmente, vous devez utiliser memory-profiler. Cette fois, je savais où cela augmenterait, et je ne pouvais pas m'en empêcher, mais je voulais savoir combien cela augmenterait, donc j'avais besoin de connaître le pic d'utilisation.

Que se passe-t-il si vous n'utilisez pas l'utilisation de pointe?

Vous pouvez obtenir l'utilisation actuelle de la mémoire avec psutil. Voir this.

Cependant, ce n'est pas un pic, donc par exemple, avec un tel code

Prendre l'utilisation actuelle de la mémoire


import psutil

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

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

Le résultat est le suivant.

Pas très différent


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)

J'utilise beaucoup de mémoire à l'intérieur de f (), mais je ne l'utilise pas à l'extérieur, donc je ne peux pas le dire de l'extérieur.

Prends-le en 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())

Dans ce cas, cela ressemble à ceci:

J'utilise beaucoup seulement au milieu


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)

Ce serait bien si je pouvais mettre du code qui identifie l'utilisation de la mémoire là où il semble utiliser la mémoire, mais je ne voulais pas faire cela.

Que s'est-il passé avec cette méthode?

Prenez une utilisation maximale


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')

En conséquence, c'est devenu comme ça.

Augmente après


before: 9072 KB
after:  165532 KB

Je suis heureux.

Les références

Mesurer la consommation de mémoire des programmes Linux

À propos du code

N'hésitez pas à utiliser le code de cet article pour les scripts Python développés par vous ou votre entreprise.

Recommended Posts

Prenez votre propre utilisation maximale de la mémoire sous Linux et Python
Créez vos propres commandes Linux en Python
[Python] Enregistrez votre propre bibliothèque dans PyPI
Installer Linux sur Chromebox
Surveiller l'utilisation du disque sous Linux
Installez Python Pillow sur Amazon Linux
[Python] Créez votre propre bot LINE
Créez votre propre manuel. [Linux] [homme]
[Python] journalisation dans votre propre module
Essayez d'implémenter k-NN par vous-même
Afficher l'utilisation du disque sur Linux personnel
Présentation de l'environnement Python 3.5.2 sur Amazon Linux
python> os.path.join ('data', 'checkpoint')> 'data / checkpoint' sous linux
Load_data self-made pour exécuter l'exemple de code Python MNIST sur votre propre ensemble de données
Installez Python3 et Django sur Amazon Linux (EC2) et exécutez le serveur Web
[LLDB] Créez votre propre commande avec Python
Trouver des fichiers comme Linux Find en Python
Utilisez facilement vos propres fonctions en Python
Créez un environnement python sur votre Mac
[Python] Empaquetez et distribuez vos propres modules
Remarque sur la création de votre propre environnement Miniconda
[C] [python] Lire avec AquesTalk sous Linux
Utilisation de base de Btrfs dans Arch Linux
Lors de l'examen de l'utilisation de la mémoire dans Python 3
Jusqu'à ce que vous installiez votre propre bibliothèque Python
5 raisons d'installer Linux sur votre ordinateur portable.
Importez vos propres fonctions avec AWS Glue
Dockerfile: installer Docker sur un serveur Linux
Publiez votre propre bibliothèque Python sur Homebrew
Installez Python 3.8, Pip 3.8 sur EC2 (Amazon Linux 2)
Obtenez votre propre adresse IP en Python
[Python] Implémentez votre propre classe de type liste à l'aide de collections.UserList
Linux C / C ++ Créez votre propre environnement de création de bibliothèque
Créez rapidement votre propre module avec setuptools (python)
Créez un environnement de développement Python sur votre Mac
Comment charger facilement le processeur / la mémoire sous Linux
Importez vos propres modules avec le développement Python de Grasshopper
python: utilisez votre propre classe pour numpy ndarray