Golang - 如何克服 bufio 的 Scan() 缓冲区限制?

标签 go io buffer

我正在使用 bufio 扫描器的 .Scan() 方法来读取文本文件行。然而,当我在文件行中达到一定大小时,扫描仪不再允许我读取,它只返回一个空行。

我应该如何配置缓冲区以接收大量数据?

bigfile.txt 只是一个文件,一行中有许多整数,中间用空格分隔。例如,一行 40000 个整数。 (请注意,它适用于 10000 个或更少整数的文件行,但不适用于 40000 个整数)

234 544 765 45 34 67 67 87 98 43 [... n = 40000 ]

func main() {
    readInputFile("bigfile.txt")
}

func readInputFile(name string) {
    inFile, _ := os.Open(name)
    defer inFile.Close()

    scanner := bufio.NewScanner(inFile)

    for scanner.Scan() {
        line := scanner.Text()
        fmt.Printf(line)
    }
}

最佳答案

根据 documentation和相应的source code ,默认情况下Scanner使用容量为64K的内部缓冲区。在您的情况下,内部缓冲区不足以存储 40000 个整数。 调用Scan之前设置扫描仪要使用的缓冲区,即

scanner := bufio.NewScanner(inFile)

//adjust the capacity to your need (max characters in line)
const maxCapacity = 512*1024  
buf := make([]byte, maxCapacity)
scanner.Buffer(buf, maxCapacity)

关于Golang - 如何克服 bufio 的 Scan() 缓冲区限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859222/

相关文章:

bash - 如何使用 Bash 重定向标准输入和输出

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

javascript - 使用react-native通过TCP Socket发送mp3文件

javascript - UTF-16 十六进制解码 NodeJS

go - CSV 中的日期格式在导入 BigQuery 之前

perl - 对于 Seq 对象数组,是否存在相当于 IO::ScalarArray 的 Bioperl?

go - 写入exec.Cmd.StdinPipe()不会做任何事情

mysql - 调整 MySQL 缓冲区大小 - Mac Mini 2012(16GB)

Go的monkey.PatchInstanceMethod返回 "permission denied"错误?

go - 嵌套提升的接口(interface)方法变得不可见