Golang超大文件读取的方案有哪些

  介绍

小编给大家分享一下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超大文件读取的方案有哪些