Python >> Tutoriel Python >  >> Python Tag >> Linux

Vérifier la mémoire disponible sous Linux

Vous pouvez également lire la source de free les informations de, /proc/meminfo :

~ head /proc/meminfo
MemTotal:        4039168 kB
MemFree:         2567392 kB
MemAvailable:    3169436 kB
Buffers:           81756 kB
Cached:           712808 kB
SwapCached:            0 kB
Active:           835276 kB
Inactive:         457436 kB
Active(anon):     499080 kB
Inactive(anon):    17968 kB

En Python, par exemple :

with open('/proc/meminfo') as file:
    for line in file:
        if 'MemFree' in line:
            free_mem_in_kb = line.split()[1]
            break

vous obtiendrez la mémoire libre en Ko dans le free_mem_in_kb variable. Avec quelque chose de similaire pour la mémoire totale, vous pouvez soustraire les valeurs (ou ajouter des tampons, mis en cache, etc.).

Vous pouvez également créer un dictionnaire des valeurs du fichier :

from collections import namedtuple
MemInfoEntry = namedtuple('MemInfoEntry', ['value', 'unit'])

meminfo = {}
with open('/proc/meminfo') as file:
    for line in file:
        key, value, *unit = line.strip().split()
        meminfo[key.rstrip(':')] = MemInfoEntry(value, unit)

Récupérez ensuite les valeurs avec meminfo['MemAvailable'].value , par exemple.


Pourcentage de mémoire utilisée (hors tampons et cache) :

free | awk 'FNR == 3 {print $3/($3+$4)*100}'

Pour votre question, vous avez ajouté :"au-dessus de 7,2 gigaoctets", mais je suppose qu'un pourcentage pourrait être plus flexible.

Pour développer cela, la même chose peut être utilisée pour "pourcentage de mémoire libre":

free | awk 'FNR == 3 {print $4/($3+$4)*100}'

awk est un outil de numérisation de modèles avec des charges et des charges de paramètres. FNR est le numéro d'enregistrement d'entrée dans le fichier d'entrée actuel. Fondamentalement, la ligne qui est actuellement traitée. Ainsi, FNR recherchera la 3ème ligne où les chiffres correspondent à ce que vous voulez. Les 3 $ et 4 $ pointent vers les 3e et 4e colonnes. Si vous voulez le numéro lui-même, utilisez :

free | awk 'FNR == 3 {print $3}'
free | awk 'FNR == 3 {print $4}'

Exemple :

$ free
             total       used       free     shared    buffers     cached
Mem:      16419996   16144316     275680          0     447220   12589412
-/+ buffers/cache:    3107684   13312312
Swap:     16761852      38532   16723320
~$ free | awk 'FNR == 3 {print $3}'
3109056
~$ free | awk 'FNR == 3 {print $4}'
13311240

Si vous voulez avec buffers et cache :FNR=2. Si vous voulez échanger, FNR=4.


Le code Python de muru m'a intrigué de l'utiliser dans une classe de décorateur pour mesurer la consommation de mémoire d'une fonction.

class memoryit:

    def FreeMemory():
        with open('/proc/meminfo') as file:
            for line in file:
                if 'MemFree' in line:
                    free_memKB = line.split()[1]
                    return (float(free_memKB)/(1024*1024))    # returns GBytes float

    def __init__(self, function):    # Decorator class to print the memory consumption of a 
        self.function = function     # function/method after calling it a number of iterations

    def __call__(self, *args, iterations = 1, **kwargs):
        before = memoryit.FreeMemory()
        for i in range (iterations):
            result = self.function(*args, **kwargs)
        after = memoryit.FreeMemory()
        print ('%r memory used: %2.3f GB' % (self.function.__name__, (before - after) / iterations))
        return result

Fonction pour mesurer la consommation :

@memoryit
def MakeMatrix (dim):
    matrix = []   
    for i in range (dim):
        matrix.append([j for j in range (dim)])
    return (matrix)

Utilisation :

print ("Starting memory:", memoryit.FreeMemory()) 
m = MakeMatrix(10000)    
print ("Ending memory:", memoryit.FreeMemory() )

Impression :

Starting memory: 10.58599853515625
'MakeMatrix' memory used: 3.741 GB
Ending memory: 6.864116668701172