Maison > développement back-end > Golang > Comment puis-je mesurer avec précision l'empreinte mémoire d'une Go Map ?

Comment puis-je mesurer avec précision l'empreinte mémoire d'une Go Map ?

Linda Hamilton
Libérer: 2024-12-21 02:09:10
original
767 Les gens l'ont consulté

How Can I Accurately Measure the Memory Footprint of a Go Map?

Mesurer l'empreinte mémoire d'une carte Go

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.

Structure de l'en-tête de la carte

type hmap struct {
    count int // # live cells == size of map
    flags uint32
    hash0 uint32 // hash seed
    B     uint8  // log_2 of # of buckets
}
Copier après la connexion

La taille de l'en-tête est simplement la taille de la structure hmap : unsafe.Sizeof(hmap).

Structure du compartiment

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.
}
Copier après la connexion

La constante bucketCnt définit le nombre de paires clé-valeur par compartiment :

bucketCnt     = 1 << bucketCntBits // equals decimal 8
bucketCntBits = 3
Copier après la connexion

Calcul de l'empreinte mémoire de la carte

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 ))

  • unsafe.Sizeof(hmap) : Taille de la carte header
  • (len(theMap) * 8) : Taille totale des clés, en supposant qu'il s'agisse de chaînes (8 octets chacune)
  • (len(theMap) * 8 * unsafe.Sizeof(x) ) : Taille totale des valeurs, en supposant qu'elles soient de type x
  • (len(theMap) * 8 * unsafe.Sizeof(y)) : Taille totale du débordement buckets, le cas échéant (en supposant que les buckets de débordement soient également de type 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal