您好,欢迎访问一九零五行业门户网

两个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: %s\n
更多相关技术文章,请访问go语言教程栏目!
以上就是两个golang超大文件读取的方案的详细内容。
其它类似信息

推荐信息