J'écris un script Python qui télécharge des vidéos 4K et les lit à la demande. Lorsque la mémoire de mon appareil dépasse 7,2 Go, la vidéo présentant le plus petit nombre de vues est supprimée.
En utilisant la commande free ou la commande top , je peux obtenir les informations sur la mémoire. Mais concrètement, comment puis-je utiliser la mémoire totale utilisée ? Afin que je puisse renvoyer ceci à la fonction Python à comparer avec le seuil de mémoire.
Pourcentage de mémoire utilisée (à l'exclusion des mémoires tampons et du cache):
free | awk 'FNR == 3 {print $3/($3+$4)*100}'
Pour votre question, vous avez ajouté: "plus de 7,2 gigaoctets", mais je suppose qu'un pourcentage pourrait être plus flexible.
Pour développer cela, on peut utiliser la même chose pour "pourcentage de mémoire disponible":
free | awk 'FNR == 3 {print $4/($3+$4)*100}'
awk
est un outil d'analyse de motif 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 en cours de traitement. Donc, FNR recherchera la 3ème ligne où les chiffres sont ce que vous voulez. Les 3 $ et 4 $ pointent vers les 3ème et 4ème 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 les tampons et le cache: FNR = 2. Si vous voulez échanger, FNR = 4.
Vous pouvez également lire la source des informations de free
, /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
Dans 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 la variable free_mem_in_kb
. 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.