Go で大規模なマップを操作する場合、メモリ消費を効果的に管理することが重要です。ただし、マップのバイト長を直接計算するための組み込みメソッドはありません。
「エンコーディング/バイナリ」パッケージはスライスと固定値の Size 関数を提供しますが、マップには適用できません。キーと値のペアを手動で抽出してその長さを計算するのは、Go の内部オーバーヘッドが除外されるため、面倒で不正確になります。
この制限を克服するには、マップの基礎となる構造を詳しく調べることができます。 Go のマップは、ヘッダーとバケットの配列という 2 つの主要なコンポーネントで構成されます。
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 中国語 Web サイトの他の関連記事を参照してください。