Golang超大文件读取的两个方案
- 流处理方式
- 分片处理
去年的面试中我被问到超大文件你怎么处理,这个问题确实当时没多想,回来之后仔细研究和讨论了下这个问题,对大文件读取做了一个分析
比如我们有一个log文件,运行了几年,有100G之大。按照我们之前的操作可能代码会这样写:
func ReadFile(filePath string) []byte{
content, err := (filePath)
if err != nil {
("Read error")
}
return content
}
上面的代码读取几兆的文件可以,但是如果大于你本身及其内存,那就直接翻车了。因为上面的代码,是把文件所有的内容全部都读取到内存之后返回,几兆的文件,你内存够大可以处理,但是一旦上几百兆的文件,就没那么好处理了。那么,正确的方法有两种,第一个是使用流处理方式代码如下:
func ReadFile(filePath string, handle func(string)) error {
f, err := (filePath)
defer ()
if err != nil {
return err
}
buf := (f)
for {
line, err := ("\n")
line = (line)
handle(line)
if err != nil {
if err == {
return nil
}
return err
}
return nil
}
}
第二个方案就是分片处理,当读取的是二进制文件,没有换行符的时候,使用下面的方案一样处理大文件
func ReadBigFile(fileName string, handle func([]byte)) error {
f, err := (fileName)
if err != nil {
("can't opened this file")
return err
}
defer ()
s := make([]byte, 4096)
for {
switch nr, err := (s[:]); true {
case nr < 0:
(, "cat: error reading: %s\n