我正在阅读一个包含1kk +对象的json文件,我需要组织和计算一些数据,为此,我创建了两个映射,以便我可以写入和读取它,当我运行一个简单的循环时,代码需要40s才能完成,例如:
var acc int
firstContent := 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
}
}
我试图优化使用并避免并发,但是当我使用它时,它需要更长的时间才能完成。goroutinesmutex
var 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()
幕布斯7119047
肥皂起泡泡
相关分类