第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go map 的內(nèi)存高效實現(xiàn)?

go map 的內(nèi)存高效實現(xiàn)?

Go
梵蒂岡之花 2023-05-08 18:03:16
我的用例是通過網(wǎng)絡傳輸一組成員(整數(shù)),所以我們采用增量編碼,在接收端我們解碼并將整個列表作為映射,map[string]struct{} 復雜度為 O(1)用于會員檢查。我面臨的問題是,對于 200 萬個整數(shù),成員的實際大小僅為 15MB,但堆中映射的大小為 100+MB。似乎 Go 的實際地圖實現(xiàn)不適合大型地圖。由于它是一個客戶端 SDK,我不想對可用內(nèi)存產(chǎn)生太大影響,并且可能有多個這樣的組需要在內(nèi)存中保存很長時間——大約 1 周。為此,Go 中是否有更好的替代 DS?type void struct{}func ToMap(v []int64) map[string]void { out := map[string]void{} for _, i := range v {   out[strconv.Itoa(int(i))] = void{} } return out}
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

這是一種更節(jié)省內(nèi)存的地圖形式:


type void struct{}


func ToMap(v []int64) map[int64]void {

    m := make(map[int64]void, len(v))

    for _, i := range v {

        m[i] = void{}

    }

    return m

}

Go 映射針對整數(shù)鍵進行了優(yōu)化。通過給出確切的地圖大小作為提示來優(yōu)化地圖分配。


Astring有一個隱式指針,它會使垃圾收集器 (gc) 每次掃描時都遵循該指針。


這是 200 萬個偽隨機整數(shù)的 Go 基準測試:


package main


import (

    "math/rand"

    "strconv"

    "testing"

)


type void struct{}


func ToMap1(v []int64) map[string]void {

    out := map[string]void{}

    for _, i := range v {

        out[strconv.Itoa(int(i))] = void{}

    }

    return out

}


func ToMap2(v []int64) map[int64]void {

    m := make(map[int64]void, len(v))

    for _, i := range v {

        m[i] = void{}

    }

    return m

}


var benchmarkV = func() []int64 {

    v := make([]int64, 2000000)

    for i := range v {

        v[i] = rand.Int63()

    }

    return v

}()


func BenchmarkToMap1(b *testing.B) {

    b.ReportAllocs()

    b.ResetTimer()

    for N := 0; N < b.N; N++ {

        ToMap1(benchmarkV)

    }

}


func BenchmarkToMap2(b *testing.B) {

    b.ReportAllocs()

    b.ResetTimer()

    for N := 0; N < b.N; N++ {

        ToMap2(benchmarkV)

    }

}

輸出:


$ go test tomap_test.go -bench=.

BenchmarkToMap1-4     2  973358894 ns/op    235475280 B/op    2076779 allocs/op

BenchmarkToMap2-4    10  188489170 ns/op     44852584 B/op         23 allocs/op


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號