Lorsque vous travaillez avec de grandes cartes dans Go, il est crucial de gérer efficacement la consommation de mémoire. Cependant, il n'existe pas de méthode intégrée pour calculer directement la longueur en octets d'une carte.
Le package "encoding/binary" fournit une fonction Size pour les tranches et les valeurs fixes, mais elle n'est pas applicable aux cartes. Extraire manuellement des paires clé-valeur et calculer leur longueur serait fastidieux et imprécis, car cela exclurait la surcharge interne de Go.
Pour surmonter cette limitation, nous pouvons approfondir la structure sous-jacente d'une carte. Une carte dans Go se compose de deux composants principaux : un en-tête et un tableau de compartiments.
type hmap struct { count int // # live cells == size of map flags uint32 hash0 uint32 // hash seed B uint8 // log_2 of # of buckets }
La taille de l'en-tête est simplement la taille de la structure hmap : unsafe.Sizeof(hmap).
Chaque compartiment contient un nombre spécifique de paires clé-valeur. Le nombre de compartiments est déterminé par le champ B dans l'en-tête.
type bmap struct { tophash [bucketCnt]uint8 // Followed by bucketCnt keys and then bucketCnt values. }
La constante bucketCnt définit le nombre de paires clé-valeur par compartiment :
bucketCnt = 1 << bucketCntBits // equals decimal 8 bucketCntBits = 3
Connaissant les tailles de l'en-tête et des buckets, nous pouvons calculer l'empreinte mémoire d'une carte comme suit :
unsafe.Sizeof(hmap) (len(theMap) * 8) (len(theMap) * 8 * unsafe.Sizeof(x)) (len(theMap) * 8 * unsafe.Sizeof(y ))
Cette formule fournit une estimation précise de la mémoire consommée par une carte, en tenant compte à la fois de la surcharge d'en-tête et du contenu de la carte .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!