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.ReadFile
比bufio
读写还要快。