介绍
小编给大家分享一下Golang超大文件读取的方案有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
Golang超大文件读取的两个方案
1。流处理方式
2。分片处理
去年的面试中我被问到超大文件你怎么处理,这个问题确实当时没多想,回来之后仔细研究和讨论了下这个问题,对大文件读取做了一个分析
比如我们有一个日志文件,运行了几年,有100克之大。按照我们之前的操作可能代码会这样写:
引用>func ReadFile (filePath 字符串),[]字节{ ,,,,err 内容:=,ioutil.ReadFile (filePath) ,,,if err !=, nil { ,,,,,,,log.Println (“Read error") ,,,} ,,,return 内容 }上面的代码读取几兆的文件可以,但是如果大于你本身及其内存,那就直接翻车了。因为上面的代码,是把文件所有的内容全部都读取到内存之后返回,几兆的文件,你内存够大可以处理,但是一旦上几百兆的文件,就没那么好处理了。那么,正确的方法有两种,第一个是使用流处理方式代码如下:
引用>func ReadFile(字符串,filePath handle func (string)), error { ,,,,,err :=, os.Open (filePath) ,,,defer f.Close () ,,,if err !=, nil { ,,,,,,,return 犯错 ,,,} ,,,buf :=, bufio.NewReader (f) ,,,for { ,,,,,,,,,err :=, buf.ReadLine (“\ n") ,,,,,,,line =, strings.TrimSpace(线) ,,,,,,,处理(线) ,,,,,,,if err !=, nil { ,,,,,,,,,,,if err ==, io.EOF { ,,,,,,,,,,,,,,,return 零 ,,,,,,,,,,,} ,,,,,,,,,,,return 犯错 ,,,,,,,} ,,,,,,,return 零 ,,,} }第二个方案就是分片处理,当读取的是二进制文件,没有换行符的时候,使用下面的方案一样处理大文件
引用>func ReadBigFile(字符串,fileName handle func([]字节),error { ,,,,,err :=, os.Open(文件名) ,,,if err !=, nil { ,,,,,,,fmt.Println(“停下来# 39;t opened 却;能够file") ,,,,,,,return 犯错 ,,,} ,,,defer f.Close () ,,,s :=,([]字节,4096) ,,,for { ,,,,,,,switch nr, err :=, f.Read (s [:]);, true { ,,,,,,,case nr & lt;, 0: ,,,,,,,,,,,fmt.Fprintf (os.Stderr,,“猫:,error 阅读:,% s \ n以上是“Golang超大文件读取的方案有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
Golang超大文件读取的方案有哪些