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

时间:2016-10-04 18:20:54

标签: 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)
    }
}

2 个答案:

答案 0 :(得分:15)

根据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)

答案 1 :(得分:0)

使用动态缓冲区大小的代码。获取文件大小并在扫描仪中使用

info, infoErr := file.Stat()
var maxSize int
scanner := bufio.NewScanner(file)
maxSize = int(info.Size())
buffer := make([]byte, 0, maxSize)
scanner.Buffer(buffer, maxSize)

对于 JSON 添加更多字节 最大尺寸 = 最大尺寸 + 1 要么 最大尺寸 = 最大尺寸 + 10