GolangNote

Golang笔记

Golang 按行读取大文件效率较好的方法

Permalink

个人使用中发现,按行读取较大文件 10~100MB ,使用 ReadSlice()scanner.Scan() 性能好一些。

按行读取大文件

Go: ReadSlice 按行读取文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import (
	"bufio"
	"errors"
	"fmt"
	"io"
	"strings"
)

func Grep(reader io.Reader, str string) error {
	var buf strings.Builder
	r := bufio.NewReaderSize(reader, 64*1024)

	for {
		frag, err := r.ReadSlice('\n')
		if err == bufio.ErrBufferFull {
			buf.Write(frag)
			continue // partial line
		}
		if err == io.EOF {
			if len(frag) == 0 {
				break
			}
		} else if err != nil {
			return errors.New("index parse error: " + err.Error())
		}
		buf.Write(frag)
		line := buf.String()

		pos := strings.Index(line, str)
		if pos != -1 {
			fmt.Printf(line)
		}
		buf.Reset()
	}
	return nil
}

func main() {
	r := strings.NewReader("line 1\nline 2 test\nline3\nline test4")
	_ = Grep(r, "test")
}

本文网址: https://golangnote.com/topic/307.html 转摘请注明来源

Related articles

Golang 生成防识别的图片验证码

验证码 captcha 是对抗密码强力破解、垃圾信息的有效方式,一般用于用户注册、登录,当检测到频繁发帖时也会启用验证码。下面介绍用golang 生成防机器识别的图片验证码。...

Write a Comment to "Golang 按行读取大文件效率较好的方法"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.18 Processed in 0ms