gpt4 book ai didi

go - 如何将 io.Reader 拆分为多个行数相等的 io.Reader?

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:44 29 4
gpt4 key购买 nike

我想在 Go 中按照 here 中的要求做同样的事情.

我正在解析一个巨大的日志文件,我需要逐行解析它。在每一行上,我将该行反序列化为一个结构。数据可能来自任何数据源(文件、网络等)。因此,我在我的函数中收到一个 io.Reader。由于文件很大,我想将它拆分到多个 goroutine 中。

我本可以使用 io.Pipe 等轻松完成此操作。但是,我需要在不剪切行的情况下拆分文件,例如,在中间不剪切的情况下将文件分成两半。这样,每个 goroutine 都可以接收一个 io.Reader,然后它们可以在文件的不同部分工作。

有时,我还需要将 io.MultiReader 发送到我的函数。在那种情况下,我会再做同样的事情。因此,它不一定是同一个文件(但大部分是)。

func scan(r io.Reader, pf ProcessFunc) {
// need to split `r` here if `r` is:
// r.(io.ReadSeeker)

// run goroutine #1 with 50% of the stream
// uses bufio.Scanner

// run goroutine #2 with 50% of the stream
// uses bufio.Scanner

// another goroutine is receiving the deserialized values
// and sends them to the ProcessFunc for processing further
// down the pipeline
}

假设数据是这样的:

foo1 bar2
foo3 bar4
foo5 bar6
foo7 bar8

goroutine #1 会像这样得到一个 io.Reader:

foo1 bar2
foo3 bar4

goroutine #2 将得到一个 io.Reader,如下所示:

foo5 bar6
foo7 bar8

但不是这样的:

o5 bar6    -> breaks the line in the second io.Reader
foo7 bar8

最佳答案

你有几个选择:

  1. 如果您有可查找的数据,您可以查找然后扫描下一个换行符,这样您就可以确保只在换行符处拆分

  2. 将行而不是 io.readers 传递到 goroutine。基本上,每个 goroutine 都有一个 channel ,主路由会将来自 io.reader 的每一行输入到 channel 中。

  3. 事先用 split

    之类的东西分割文件

关于go - 如何将 io.Reader 拆分为多个行数相等的 io.Reader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444888/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com