Apabila bekerja dengan peta besar dalam Go, adalah penting untuk mengurus penggunaan memori dengan berkesan. Walau bagaimanapun, tiada kaedah terbina dalam untuk mengira secara terus panjang bait peta.
Pakej "pengekodan/perduaan" menyediakan fungsi Saiz untuk hirisan dan nilai tetap, tetapi ia tidak berkenaan pada peta. Mengekstrak pasangan nilai kunci secara manual dan mengira panjangnya adalah membosankan dan tidak tepat, kerana ia akan mengecualikan overhed Go dalaman.
Untuk mengatasi had ini, kita boleh menyelidiki struktur asas peta. Peta dalam Go terdiri daripada dua komponen utama: pengepala dan tatasusunan baldi.
type hmap struct { count int // # live cells == size of map flags uint32 hash0 uint32 // hash seed B uint8 // log_2 of # of buckets }
Saiz pengepala hanyalah saiz struct hmap: tidak selamat.Sizeof(hmap).
Setiap baldi memegang bilangan pasangan nilai kunci tertentu. Bilangan baldi ditentukan oleh medan B dalam pengepala.
type bmap struct { tophash [bucketCnt]uint8 // Followed by bucketCnt keys and then bucketCnt values. }
Timba malarCnt mentakrifkan bilangan pasangan nilai kunci setiap baldi:
bucketCnt = 1 << bucketCntBits // equals decimal 8 bucketCntBits = 3
Mengetahui saiz pengepala dan baldi, kita boleh mengira jejak ingatan peta seperti berikut:
tidak selamat.Sizeof(hmap) (len(theMap) * 8) (len(theMap) * 8 * unsafe.Sizeof(x)) (len(theMap) * 8 * unsafe.Sizeof (y))
Formula ini memberikan anggaran tepat memori yang digunakan oleh peta, mengambil mengambil kira kedua-dua bahagian atas kepala dan kandungan peta.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengukur Jejak Memori Peta Go dengan Tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!