Go에서 큰 맵을 작업할 때는 메모리 소비를 효과적으로 관리하는 것이 중요합니다. 그러나 맵의 바이트 길이를 직접 계산하는 기본 제공 방법은 없습니다.
"인코딩/바이너리" 패키지는 슬라이스 및 고정 값에 대한 크기 함수를 제공하지만 맵에는 적용할 수 없습니다. 키-값 쌍을 수동으로 추출하고 길이를 계산하는 것은 내부 Go 오버헤드를 제외하므로 지루하고 부정확합니다.
이러한 한계를 극복하기 위해 맵의 기본 구조를 자세히 알아볼 수 있습니다. Go의 맵은 헤더와 버킷 배열이라는 두 가지 주요 구성요소로 구성됩니다.
type hmap struct { count int // # live cells == size of map flags uint32 hash0 uint32 // hash seed B uint8 // log_2 of # of buckets }
헤더의 크기는 단순히 hmap 구조체의 크기입니다. unsafe.Sizeof(hmap).
각 버킷은 특정 개수의 키-값 쌍. 버킷 수는 헤더의 B 필드에 의해 결정됩니다.
type bmap struct { tophash [bucketCnt]uint8 // Followed by bucketCnt keys and then bucketCnt values. }
상수 bucketCnt는 버킷당 키-값 쌍 수를 정의합니다.
bucketCnt = 1 << bucketCntBits // equals decimal 8 bucketCntBits = 3
헤더와 버킷의 크기를 알면 맵의 메모리 사용량을 다음과 같이 계산할 수 있습니다. 다음:
unsafe.Sizeof(hmap) (len(theMap) * 8) (len(theMap) * 8 * unsafe.Sizeof(x)) (len(theMap) * 8 * unsafe.Sizeof(y ))
이 공식은 맵에서 소비하는 메모리의 정확한 추정치를 제공합니다. 헤더 오버헤드와 지도의 콘텐츠를 모두 고려합니다.
위 내용은 Go 지도의 메모리 공간을 어떻게 정확하게 측정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!