栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

两个Golang超大文件读取的方案

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

两个Golang超大文件读取的方案

下面由golang教程栏目给大家介绍两个Golang超大文件读取的方案,希望对需要的朋友有所帮助!

Golang超大文件读取的两个方案

1.流处理方式

2.分片处理

去年的面试中我被问到超大文件你怎么处理,这个问题确实当时没多想,回来之后仔细研究和讨论了下这个问题,对大文件读取做了一个分析

比如我们有一个log文件,运行了几年,有100G之大。按照我们之前的操作可能代码会这样写:

func ReadFile(filePath string) []byte{    content, err := ioutil.ReadFile(filePath)    if err != nil {        log.Println("Read error")    }    return content}

上面的代码读取几兆的文件可以,但是如果大于你本身及其内存,那就直接翻车了。因为上面的代码,是把文件所有的内容全部都读取到内存之后返回,几兆的文件,你内存够大可以处理,但是一旦上几百兆的文件,就没那么好处理了。那么,正确的方法有两种,第一个是使用流处理方式代码如下:

func ReadFile(filePath string, handle func(string)) error {    f, err := os.Open(filePath)    defer f.Close()    if err != nil {        return err    }    buf := bufio.NewReader(f)    for {        line, err := buf.ReadLine("n")        line = strings.TrimSpace(line)        handle(line)        if err != nil {            if err == io.EOF{                return nil            }            return err        }        return nil    }}

第二个方案就是分片处理,当读取的是二进制文件,没有换行符的时候,使用下面的方案一样处理大文件

func ReadBigFile(fileName string, handle func([]byte)) error {    f, err := os.Open(fileName)    if err != nil {        fmt.Println("can't opened this file")        return err    }    defer f.Close()    s := make([]byte, 4096)    for {        switch nr, err := f.Read(s[:]); true {        case nr < 0:            fmt.Fprintf(os.Stderr, "cat: error reading: %sn

更多相关技术文章,请访问go语言教程栏目!

以上就是两个Golang超大文件读取的方案的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/793893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号