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

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

如何使用互斥體有效地讀取和寫入映射?

如何使用互斥體有效地讀取和寫入映射?

Go
猛跑小豬 2022-08-24 18:58:58
我正在閱讀一個包含1kk +對象的json文件,我需要組織和計算一些數(shù)據(jù),為此,我創(chuàng)建了兩個映射,以便我可以寫入和讀取它,當(dāng)我運行一個簡單的循環(huán)時,代碼需要40s才能完成,例如:var acc intfirstContent := make(map[string]int)secondContent := make(map[string]int)decoder := json.NewDecoder(bufio.NewReader(file))for decoder.More() {    var dt &MyStruct{}    decoder.Decode()    if _, ok := firstContent[dt.Name]; !ok {        firstContent["some-data"] = 1        acc++ // count the uniqueness    } else {        firstContent["some-data"] += 1    }    if _, ok := secondContent[dt.City]; !ok {        first["some-data"] = 1    } else {        first["some-data"] += 1    }}我試圖優(yōu)化使用并避免并發(fā),但是當(dāng)我使用它時,它需要更長的時間才能完成。goroutinesmutexvar mutex = sync.RWMutex{}for reader.More() {    var dt &MyStruct{}    reader.Decode(&dt)    go func(name string) {        mutex.Lock()        if _, ok := firstContent[name]; !ok {            firstContent[name] = 1 // need to convert to *int64, i know...            atomic.AddInt32(acc, 1)        } else {            atomic.AddInt64(firstContent[name], 1)        }        mutex.Unlock()    }(dt.Name)    go func(city string) {        mutex.Lock()        if _, ok := secondContent[city]; !ok {            secondContent[city] = 1        } else {            atomic.AddInt(secondContent[city], 1)        }        mutex.Unlock()    }(dt.City)}為什么需要更長的時間才能完成?以?在這種情況下,我該如何提高速度?mutex.Lock()
查看完整描述

2 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊

就像上面的Jakub說的,你可以在單獨的goroutines(如MapReduce框架)上拆分輸入文件和進(jìn)程,這肯定會加快速度。

另外,您是否嘗試過在 JSON 文件中創(chuàng)建對象的 go-struct 并將其編組到它們的列表中,然后從那里進(jìn)行計算?不知道那會不會更好,但這是一個想法。


查看完整回答
反對 回復(fù) 2022-08-24
?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗 獲得超6個贊

您的問題無法通過并發(fā)來解決。花費大部分時間的是解析json,而不是計算名稱。你可以說這種情況有點悖論,因為你必須在單個線程上讀取文件。當(dāng)然,如果可以的話,也許將文件拆分為較小的文件并在單獨的線程上處理每個文件會有所幫助。


查看完整回答
反對 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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