> 백엔드 개발 > Golang > Go 맵의 메모리 공간을 정확하게 계산하는 방법은 무엇입니까?

Go 맵의 메모리 공간을 정확하게 계산하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-11 21:23:10
원래의
260명이 탐색했습니다.

How to Accurately Calculate the Memory Footprint of a Go Map?

Go에서 지도의 메모리 사용량 계산

지도의 메모리 소비량을 결정하는 것은 리소스 관리 및 최적화에 필수적입니다. 그러나 Go에서 맵의 바이트 길이를 계산하는 것은 간단한 작업이 아닙니다.

Go의 "인코딩/바이너리" 패키지는 슬라이스의 메모리 공간과 "고정 값"을 계산하기 위한 Size 함수를 제공하지만 지도를 지원하지 않습니다. 맵에서 키-값 쌍의 유형과 크기를 수동으로 추론하는 것은 지루하고 부정확할 수 있습니다.

맵 구조 살펴보기

해결책은 지도의 내부 구조. Go 맵은 헤더(hmap)와 버킷 배열(bmap)로 표시됩니다. hmap에는 라이브 셀 수(맵 크기), 해시 시드, 버킷 수 등 필수 정보가 포함되어 있습니다.

맵 메모리 공간 계산

메모리 지도의 공간은 다음과 같이 계산할 수 있습니다.

  1. hmap 헤더 크기: unsafe.Sizeof(hmap)
  2. 키에 의해 소비되는 메모리: len(map) * 8
  3. 값에 의해 소비되는 메모리: len(map) 8 unsafe.Sizeof(value_type )
  4. 버킷의 메모리 오버헤드: len(map) 8 unsafe.Sizeof(key_type)

예제 코드

다음 코드는 맵의 메모리 사용량 계산을 보여줍니다.

import (
    "fmt"
    "unsafe"
)

type MyMap map[string]int

func main() {
    m := MyMap{"key1": 1, "key2": 2}

    keySize := unsafe.Sizeof(string("key1"))
    valueSize := unsafe.Sizeof(1)
    headerSize := unsafe.Sizeof(hmap{})
    numKeys := len(m)

    memoryFootprint := headerSize + (numKeys * 8) + (numKeys * 8 * valueSize) + (numKeys * 8 * keySize)

    fmt.Printf("Memory footprint of the map: %d bytes\n", memoryFootprint)
}
로그인 후 복사

이 코드는 헤더, 키, 값과 버킷 오버헤드가 있습니다.

위 내용은 Go 맵의 메모리 공간을 정확하게 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿