MicroPython: surveiller la RAM avec mem_info()

En écrivant des Scripts MicroPython avancés, il arrive parfois que l'on rencontre des problèmes de mémoire.

L'exemple le plus courant, c'est d'essayer d'importer un module et de recevoir un message "Memory Allocation Error" signifiant qu'il n'y a plus de mémoire disponible pour charger du code dedans.

C'est là qu'intervient mem_info() puisqu'il donne des informations sur la consommation mémoire.


micropython.mem_info()

En appelant la fonction mem_info() sans paramètre, celle-ci affiche différentes informations.

>>> mem_info()
stack: 516 out of 7936
GC: total: 166016, used: 6368, free: 159648
 No. of 1-blocks: 116, 2-blocks: 23, max blk sz: 64, max free sz: 9967
>>> 

La ligne GC concerne le Garbage Collector (ramasse-miettes) qui gère les allocations et libération de mémoire dans le système.

Ainsi, nous disposons 166016 octets dont 6368 octets sont utilisés, ce qui laisse encore 159648 Kio de libres. A noter que la mémoire totale est légèrement supérieur puisqu'une partie est utilisé par la Stack (utilisée pour transmettre des paramètres durant les appels de fonction).

Chargeons un nouveau module et ré-inspectons la mémoire disponible

>>> import urequests
>>> mem_info()
stack: 516 out of 7936
GC: total: 166016, used: 14432, free: 151584
 No. of 1-blocks: 260, 2-blocks: 42, max blk sz: 64, max free sz: 9463
>>> 

La mémoire utilisée passe de 6368 octets à 14432 octets (6K à 14K). La mémoire disponible est réduite de 159 584 à 151 554 octets.

Traquer le gaspillage de mémoire

En utilisant la fonction mem_info() avant et après certaines fonctions (ou importation de module), il est possible de traquer les allocations de mémoire.

Essayez de retirer les variables et fonction non nécessaire pour réduire la consommation mémoire. Chose que vous pouvez contrôler en comparant les résultats de mem_info().

Allocation mémoire et fragmentation

La fonction mem_info(True) peut également rendre un autre service très important, C'est l'inspection visuelle des allocations mémoires (contenu de la Heap). Le paramètre True indique l'activation du mode Verbose (Bavard).

Cela permet d'évaluer la fragmentation de la mémoire.

>>> mem_info(True)
stack: 516 out of 7936
GC: total: 166016, used: 14576, free: 151440
 No. of 1-blocks: 267, 2-blocks: 43, max blk sz: 64, max free sz: 9454
GC memory layout; from 2000a760:
00000: h=MhhhhBDhhBTTBDhTBDBDBh===BTB=hh====B=BBBBBTB=BTB=BBBTB=TBTB=Bh
00400: ===DB=h===========h===================BBBh==h=hh========h=======
00800: ==========h=====================================================
00c00: ==========h=====================================================
01000: ==========hhhhBShhh=Thh=hhh=hhBh=hh==h==hhh=BThhhhBhhhhh=hhh=Bhh
01400: =h=======h========hhhBShhhhThh=h===hhhhhh==Bh==hhhBThhhhh=hhBhhh
01800: hh=hhh=Bhhhhhhh=Bhhhhhhh=BShhThhh=h===hhhhhh==BSh===hThhhhhhhh==
01c00: BSh===hThhhhhhhh==BLShShShShhSh=Sh==h===============hShShShShShS
02000: hShh=hhhBMDhBBBBDBBhh=BhBhDT=Bh===h===B=BBBBhhhhBhhhh=====h=h=hS
02400: hhThh=h=======h===============================h=======h=hh======
02800: =h=h=hh===============================h=======h========ShThhh=hh
02c00: h=======h=h=hh===============================h=======h========Sh
03000: Thh====h====h=======h=h===============================h=======Sh
03400: Thhhh=======h=h=hh===============================h=======ShThhhh
03800: hBhhhhhB..hhh..h=.......h=......................................
       (147 lines all free)
28800: ........

Cette représentation de la RAM contient beaucoup d'information divisé par bloc (un caractère = 1 bloc = 8 octets ).
Chaque ligne représente 1 Kio (1024 octets).

  • Point: mémoire non utilisée
  • Caractère: espace mémoire utilisé, le caractère indique le type d'objet.
  • =: appelée tail (queue), indique le prolongement d'un bloc.
  • T: Tuple
  • L: List
  • D: Dictionnaire
  • S: String
  • A: Array ou baytearray.
  • F: Float
  • h: données diverses (entier ou objet python)
  • B: fonction
  • M: Module
  • m: appelé mark (utilité encore non identifiéà.

Pour en savoir plus, voyez le détail de la fonction gc_dump_alloc_table() dans la source gc.c .

x






Aucun commentaire