当前位置: 首页 > 面试题库 >

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

昝欣可
2023-03-14
问题内容

我正在使用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)
    }
}

问题答案:

根据文档和相应的源代码,默认情况下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)


 类似资料:
  • 问题内容: 我有: 哪个追加到缓冲区,是否可以写入缓冲区的开头? 问题答案: 由于基础不是从导出的,因此您可以使用: 试试这个The Go Playground: 输出:

  • bufio 包实现了缓存IO。它包装了 io.Reader 和 io.Writer 对象,创建了另外的Reader和Writer对象,它们也实现了io.Reader和io.Writer接口,不过它们是有缓存的。该包同时为文本I/O提供了一些便利操作。 1.4.1 Reader 类型和方法 bufio.Reader 结构包装了一个 io.Reader 对象,提供缓存功能,同时实现了 io.Reade

  • 无法理解我用于开发涉及图像/视频的聊天应用程序的stomp over websocket配置中的不同参数: 我注意到网页中的SockJ发送的消息帧大小为16K。我还测试了消息大小限制是什么决定了我可以传输的消息的最大大小。 你能让我知道什么是: > 流字节限制 发送缓冲区大小限制 http消息缓存大小 什么是部分消息以及如何使用它们,它们在这里有用吗? 此外,我计划将图像/视频的最大大小设置为2G

  • 我正在使用spark 2.4.2读取包含600条记录的csv。最后100条记录有大量数据。我遇到的问题是, 我已经增加了到2g(最大允许设置)和火花驱动程序内存到1g,能够处理更多的记录,但仍然不能处理csv中的所有记录。 我试着翻页600条记录。e、 对于6个分区,我可以在每个分区处理100条记录,但由于最后100条记录太多,因此会发生缓冲区溢出。 在这种情况下,最后100条记录很大,但这可能是

  • 我有一个XML存储在CLOB中。为了显示来自XML的特定数据,我需要运行各种substr和instr函数。 我当前的代码使用varchar2(32000)变量处理它,如下所示: 我编写了一个匿名块来测试子字符串的限制,如下所示: 我注释掉了第二个子字符串,只是为了看看如果我将str_length更改为32000以下,表是否会填充数据,并且它确实被填充了。 这是我的输出 下面是我的输出:

  • 我在这里也问了这个问题https://github.com/istio/istio/issues/33416-目前没有回应,如果在座的任何人知道答案,我们将不胜感激 Istio版本是1.6.4 因此,默认情况下,每个连接的特使似乎会缓冲256Mb左右(我不明白为什么,对我来说毫无意义)。例如,当我有这样一个场景时——客户端 我知道特使过滤器可以用来改变这一切,我试过了,我键入了所有的特使命令,以确