美文网首页golang
Go 读取大文件

Go 读取大文件

作者: 三梦哥 | 来源:发表于2020-05-18 14:38 被阅读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读写还要快。

相关文章

  • Go 读取大文件

    不管是任何语言,读取大文件的时候,不可能直接将GB以上的文件直接读取加载到内存中,因为这对内存的消耗是个很大的问题...

  • java操作文件

    优雅读取文件 优雅的写入文件 读取大文件

  • 读取大文件

    with open(filename, 'rb') as f:for line in f:

  • 5、GeoTrellis-读取栅格文件

    读取单波段的栅格 读取多波段栅格 使用流读取栅格 通过流读取的tif,单个小文件可以完整的读取,大文件则Java虚...

  • python 读取大文件,避免内存溢出

    ####python读取大文件 最近在学习python的过程中接触到了python对文件的读取。python读取文...

  • python读取大文件

    我们在处理小的文本文件时一般使用.read()、.readline() 和 .readlines()方法,但是当我...

  • python读取大文件

  • python读取大文件

    对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以...

  • Python 读取大文件

  • Python读取大文件

    在工作中,我们常会遇到一个很大的文件(通常为log文件),当出现问题的时候,我们想使用程序来处理日志文件来对问题进...

网友评论

    本文标题:Go 读取大文件

    本文链接:https://www.haomeiwen.com/subject/capuohtx.html