我正在閱讀一個包含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)行計算?不知道那會不會更好,但這是一個想法。

肥皂起泡泡
TA貢獻(xiàn)1829條經(jīng)驗 獲得超6個贊
您的問題無法通過并發(fā)來解決。花費大部分時間的是解析json,而不是計算名稱。你可以說這種情況有點悖論,因為你必須在單個線程上讀取文件。當(dāng)然,如果可以的話,也許將文件拆分為較小的文件并在單獨的線程上處理每個文件會有所幫助。
- 2 回答
- 0 關(guān)注
- 103 瀏覽
添加回答
舉報
0/150
提交
取消