学习golang要努力,但是不要急!今天的这篇文章《有效使用互斥体进行映射的读写操作》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!
学习golang要努力,但是不要急!今天的这篇文章《有效使用互斥体进行映射的读写操作》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!
问题内容我正在读取一个包含 1kk+ 个对象的 JSON 文件,我需要组织并计算一些数据,为此我创建了两个地图,以便我可以对其进行写入和读取,当我运行一个简单的循环时,代码需要 40 秒才能完成,例如:
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
}
}
我尝试使用 goroutines
和 mutex
进行优化以避免并发,但是当我使用它时,需要更长的时间才能完成。
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()
?在这种情况下如何提高速度?
您的问题无法通过并发解决。花费大部分时间的是解析 json,而不是计算名称。你可以说这种情况有点矛盾,因为你必须在单线程上读取文件。也许将文件拆分成更小的文件并在单独的线程上处理每个文件会有所帮助,如果您当然可以这样做的话。
以上就是《有效使用互斥体进行映射的读写操作》的详细内容,更多关于的资料请关注编程网公众号!
--结束END--
本文标题: 有效使用互斥体进行映射的读写操作
本文链接: https://www.lsjlt.com/news/595774.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0