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')
À 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.
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.
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.
Mesurer la consommation de mémoire des programmes Linux
N'hésitez pas à utiliser le code de cet article pour les scripts Python développés par vous ou votre entreprise.
Recommended Posts