golang

Go 读取大文件

2020-05-18  本文已影响0人  三梦哥

不管是任何语言,读取大文件的时候,不可能直接将GB以上的文件直接读取加载到内存中,因为这对内存的消耗是个很大的问题,因为我们应该采用缓冲区来读写。

测试文件使用的文件大小为1.35GB的日志文本文件,使用下面两种方式来读取。

bufio

Go 标准库中包含了读写的缓冲库,直接使用即可:

package main

import (
    "bufio"
    "io"
    "log"
    "os"
    "time"
)

var filePath = `D:\Data\test.txt`

func bufioReader() {
    file, err := os.Open(filePath)
    if err != nil {
        log.Fatalln(err)
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    var line int64
    for {
        _, _, err := reader.ReadLine()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatalln(err)
            break
        }
        line++
    }
    log.Println("Done!The number of all lines is ", line)
}

func main() {
    start := time.Now()
    bufioReader()
    elapsed := time.Since(start)
    log.Println("Elapsed:", elapsed)
}

输出结果为:

2020/05/18 14:27:00 Done!The number of all lines is  8858808
2020/05/18 14:27:00 Elapsed: 1.5329915s

ioutil

Go 标准库中包括了io读写的相关工具包,直接开箱即用:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "time"
)

var filePath = `D:\Data\test.txt`

func ioutilReader() {
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Fatalln(err)
        return
    }
    fmt.Println(len(content))
}
func main() {
    start := time.Now()
    ioutilReader()
    elapsed := time.Since(start)
    log.Println("Elapsed:", elapsed)
}

输出结果为:

1452844512
2020/05/18 14:29:54 Elapsed: 801.8353ms

结果对比

读取方式 读取耗时
bufio 1.5329915s
ioutil.ReadFile 801.8353ms

测试发现,ioutil.ReadFilebufio读写还要快。

上一篇下一篇

猜你喜欢

热点阅读