Go语言文本去重性能优化
本文分析并优化一段Go语言代码,该代码用于处理75万行文本的去重任务,原始耗时17秒。优化目标是提升文本去重效率。
原始代码分析及问题:
原始代码使用map[string]bool存储去重结果,并通过字符串拼接累积结果字符串。这存在两个主要性能瓶颈:
立即学习“go语言免费学习笔记(深入)”;
字符串拼接效率低: result += fmt.Sprintf(…) 这种方式会不断创建新的字符串,导致频繁的内存分配和复制,效率低下。
map动态扩容: make(map[string]bool, 0) 未预分配map容量,随着数据增加,map会频繁扩容,造成性能损耗。
优化策略:
针对上述问题,我们采用以下优化策略:
使用strings.Builder: 将字符串拼接替换为strings.Builder,它提供更高效的字符串构建方式,避免了频繁的内存分配和复制。
预分配map容量: 初始化map时预分配一定容量,例如make(map[string]struct{}, 1000000),减少扩容次数。使用struct{}作为map值,可以节省内存,因为它不占用任何空间。
优化后的代码:
package distinctimport ( "bufio" "fmt" "io" "os" "strings")//distinctfile 为指定文件去重func distinctfile(file string, output string) { f, err := os.Open(file) if err != nil { fmt.Println(err) return } defer f.Close() reader := bufio.NewReader(f) set := make(map[string]struct{}, 1000000) // 预分配map容量 builder := strings.Builder{} // 使用strings.Builder for { line, isPrefix, err := reader.ReadLine() if err == io.EOF { break } if err != nil { fmt.Println(err) return } if !isPrefix { lineStr := string(line) if _, ok := set[lineStr]; !ok { builder.WriteString(lineStr) builder.WriteString("") set[lineStr] = struct{}{} } } } nf, err := os.Create(output) if err != nil { fmt.Println(err) return } defer nf.Close() _, err = io.Copy(nf, strings.NewReader(builder.String())) if err != nil { fmt.Println(err) }}
登录后复制
测试代码 (保持不变):
package distinctimport "testing"func TestDistinctFile(t *testing.T) { distinctfile("result.txt", "out.txt")}
登录后复制
通过以上优化,预计可以显著减少文本去重的时间消耗。 预分配的map大小可以根据实际文本行数进行调整,以达到最佳性能。 此外,考虑使用并发处理进一步提升效率也是一个可行的方向,但需要更复杂的代码设计。
以上就是Go语言文本去重:如何优化75万行文本的去重效率?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2538360.html