我试图找出逐行读取大文件并检查该行是否包含字符串的最快方法。我正在测试的文件大小约为 680mb:
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
f, err := os.Open("./crackstation-human-only.txt")
scanner := bufio.NewScanner(f)
if err != nil {
panic(err)
}
defer f.Close()
for scanner.Scan() {
if strings.Contains(scanner.Text(), "Iforgotmypassword") {
fmt.Println(scanner.Text())
}
}
}
构建程序并在我的机器上计时后,它运行了 3 秒以上 ./speed 3.13s user 1.25s system 122% cpu 3.563 total
增加缓冲区后
buf := make([]byte, 64*1024)
scanner.Buffer(buf, bufio.MaxScanTokenSize)
它变得更好一点 ./speed 2.47s user 0.25s system 104% cpu 2.609 total
我知道它会变得更好,因为其他工具可以在一秒钟内完成它而无需任何类型的索引。这种方法的瓶颈似乎是什么?
0.33s user 0.14s system 94% cpu 0.501 total
元芳怎么了
暮色呼如
慕侠2389804
相关分类