Go语言文本去重:如何优化75万行文本的去重效率?

go语言文本去重:如何优化75万行文本的去重效率?

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("n")                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万行文本的去重效率?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1384844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 04:35:28
下一篇 2025年12月11日 13:15:53

相关推荐

  • Go语言中import语句下划线_的作用是什么

    Go语言包导入:带下划线与不带下划线的差异详解 在Go语言中,导入外部包是程序开发的关键步骤。本文将详细解释Go语言import语句中使用下划线_和不使用下划线两种方式的区别,并通过示例代码进行说明。 我们经常会看到类似这样的代码: import _ “beego_demo1/routers”imp…

    2025年12月15日
    000
  • Go Websocket项目依赖库报错:如何解决nhooyr.id/websocket运行错误?

    Go Websocket项目依赖库报错解决方案 在使用go语言开发websocket项目时,依赖库报错是常见问题。本文分析一个案例:运行nhooyr.id/websocket时出现第三方库错误(图片因无法访问链接而缺失,但不会影响文章理解)。 问题分析: 标题和描述暗示问题可能源于Go版本过低,导致…

    2025年12月15日
    000
  • Go语言中import语句的下划线_究竟有何作用?

    Go语言包导入:揭秘下划线_的秘密 在Go语言中,import语句用于导入外部包,方便代码复用。然而,import语句中下划线_的使用常常让开发者困惑。本文将详细解释Go语言import语句中使用和不使用下划线_的区别。 让我们来看一个例子: import _ “beego_demo1/router…

    2025年12月15日
    000
  • Go语言map如何存储多种类型的值?

    go 语言 map 的灵活运用:存储多种数据类型 Go 语言的 map 类型是键值对存储的理想选择,方便快捷地访问数据。然而,标准的 map 定义要求 value 类型必须是单一类型,例如 map[string]string。这限制了其在需要存储多种数据类型时的灵活性。本文将介绍如何巧妙地利用 Go…

    2025年12月15日
    000
  • Go语言字符串:真的是由单个字节连接的吗?

    Go语言字符串的内部机制:字节数组与字符编码详解 Go语言中,经常会听到“Go字符串由单个字节构成”的说法,但这究竟意味着什么呢?它是否表示每个字符都只占用一个字节?汉字又是如何存储的呢? 让我们深入探讨Go语言字符串的底层实现。首先,需要明确一点:Go语言字符串并非由单个字符连接而成,而是由一系列…

    2025年12月15日
    000
  • Go语言字符串是怎样存储的:字节数组与字符的关系是什么?

    Go语言字符串的底层机制:字节序列而非字符序列 Go语言中常说“Go字符串由字节序列构成”,但这并不意味着每个字符都只占用一个字节。 Go语言的字符串底层实际是字节数组(byte[]),而不是字符数组(char[])。 这与许多使用字符数组存储字符串的编程语言不同。 字节与字符的对应关系取决于编码方…

    2025年12月15日
    000
  • Go语言字符串是字符数组还是字节数组?

    Go语言字符串:字节序列而非字符序列 Go语言的字符串通常被描述为“由单个字节组成的序列”,但这容易造成误解。许多人认为这意味着每个字符都只占用一个字节,甚至包括汉字。 实际上,Go字符串的底层实现是字节数组(byte[]),而非字符数组(char[])。 关键在于,Go字符串存储的是字节序列,而字…

    2025年12月15日
    000
  • Go语言字符串编码:Unicode和UTF-8究竟是什么关系?

    Go语言字符串编码深入解析:Unicode与UTF-8的关联 Go语言文档中指出“Go语言字符串的字节使用UTF-8编码标识Unicode文本”,这容易让人产生疑问:Unicode和UTF-8都是编码方式吗?它们之间究竟有何关联? 其实,两者并非同一种概念。关键在于理解Unicode和UTF-8的本…

    2025年12月15日
    000
  • Go语言字符串编码:Unicode和UTF-8到底是什么关系?

    Go语言字符串编码:深入理解UTF-8与Unicode Go语言文档中经常提到“Go语言字符串使用UTF-8编码表示Unicode文本”,这令许多初学者感到困惑:UTF-8和Unicode究竟是什么关系?它们都涉及编码,为何同时出现? 其实,它们是字符编码领域的两个不同层面:Unicode是字符集,…

    2025年12月15日
    000
  • Go语言字符串:UTF-8和Unicode到底是什么关系?

    深入Go语言字符串编码:UTF-8与Unicode的关联 Go语言文档中经常提到“Go语言字符串使用UTF-8编码表示Unicode文本”,这容易让人混淆UTF-8和Unicode的概念。其实,两者并非同一事物,而是存在着层层递进的关系。 Unicode是一个字符集,它为全球几乎所有字符分配了唯一的…

    2025年12月15日
    000
  • Go语言io.Copy并发使用时,为何第一次数据传输失败?

    go语言io.copy并发使用时,第一次数据传输失败的原因分析及解决方案 本文分析了在Go语言中使用io.Copy()函数进行并发数据传输时,第一次数据传输失败的问题。代码示例是一个简单的TCP代理,将客户端连接转发到后端服务器。问题表现为:客户端第一次发送的消息无法转发,后续消息则正常。 问题代码…

    2025年12月15日
    000
  • Go语言io.Copy函数数据转发失败:如何解决客户端第一次消息丢失的问题?

    Go语言io.Copy函数数据转发及客户端首包丢失问题分析与解决 本文分析Go语言中使用io.Copy函数进行TCP代理时遇到的客户端首包丢失问题,并提供解决方案。代码示例实现了一个简单的TCP代理,将客户端连接转发到后端服务器。然而,实际运行中,客户端的第一个消息经常丢失。 问题代码: packa…

    2025年12月15日
    000
  • Go语言io.Copy并发数据转发:如何避免第一次消息丢失?

    Go语言io.Copy()并发数据转发中的陷阱:首包丢失 本文分析一段Go语言代码,该代码使用net.Listen监听TCP连接,并将客户端连接转发到后端服务器。代码利用io.Copy()进行数据转发,但存在首包丢失的问题。 代码的核心是handleConn函数,它处理每个客户端连接。函数内使用两个…

    2025年12月15日
    000
  • Go程序在nohup和systemctl启动方式下工作目录不同的原因及如何解决?

    Go程序在Linux系统中的工作目录问题及解决方案 在使用Go语言开发时,程序的启动方式会直接影响os.Getwd()函数返回的工作目录,从而可能导致程序无法正确读取配置文件等问题。本文将分析Go程序在nohup ./main &和systemctl两种启动方式下工作目录差异的原因,…

    2025年12月15日
    000
  • GoLand如何直接调试Beego项目而无需go build?

    GoLand高效调试Beego项目:无需go build! 许多开发者在使用GoLand开发Beego项目时,常常需要先使用go build命令编译项目,生成可执行文件后才能进行调试,这无疑增加了开发流程的复杂度。本文将介绍如何在GoLand中直接调试Beego项目,无需繁琐的编译步骤。 直接使用g…

    2025年12月15日
    000
  • Go语言中如何高效地访问字符串中的单个字符?

    Go语言高效访问字符串字符详解 在Go语言中,直接获取字符串中特定字符的方法并非简单地使用字符串切片(例如s[1:2])。这种方法虽然能提取子串,但在处理多字节字符(例如汉字)时容易出错,因为它返回的是一个长度为1的字符串,而非单个字符。本文将介绍更有效、更准确的Go语言单个字符访问方法。 问题:使…

    2025年12月15日
    000
  • Go语言for select语句中return导致阻塞的原因是什么?

    深入剖析Go语言for…select语句中return导致阻塞的机制 本文将深入探讨Go语言中for…select语句内使用return语句导致程序阻塞的根本原因。 代码示例中,monitor函数内的for…select循环如果使用return,程序会阻塞;而使用break或contin…

    2025年12月15日
    000
  • Mgo v2 MongoDB聚合查询:如何灵活处理可选查询条件?

    本文探讨mgo v2库在MongoDB聚合查询中如何灵活处理可选查询条件。 问题在于如何动态构建$match阶段的查询条件,使其根据参数是否存在而调整。 原始代码使用bson.M直接构建$match条件,导致可选条件无法灵活控制。改进的关键在于利用map[string]interface{}的特性,…

    2025年12月15日
    000
  • Go并发编程中的“假死锁”:为什么有些阻塞不会报错?

    Go并发编程中的“伪死锁”现象 Go语言并发编程中,死锁(deadlock)是常见问题。典型死锁:多个goroutine互相等待对方释放资源,导致所有goroutine阻塞,程序停止运行,并报错fatal error: all goroutines are asleep – deadlock!。然而…

    2025年12月15日
    000
  • Go语言下RabbitMQ高效批量消费与统一确认:如何避免消息丢失和延迟?

    高效批量消费RabbitMQ消息并统一确认(Golang) 本文探讨在golang环境下,如何高效批量消费rabbitmq消息并实现统一确认(ack),避免消息丢失和延迟。 面对高频消息推送,单条消息处理的开销不可忽视,因此需要批量处理。 直接使用time.timer存在精度问题,可能导致消息延迟或…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信