我有一些大的JSON文件需要解析,我想避免一次性将所有数据加载到内存中。我想要一个函数/循环,可以一次返回一个字符。
我找到了这个示例来迭代字符串中的单词,bufio包中的ScanRunes函数看起来可以一次返回一个字符。我还使用了bufio.Reader的ReadRune函数,但那感觉像是一种沉重的方法。
编辑
我比较了三种方法。所有方法都使用循环从bufio.Reader或bufio.Scanner中提取内容。
我找到了这个示例来迭代字符串中的单词,bufio包中的ScanRunes函数看起来可以一次返回一个字符。我还使用了bufio.Reader的ReadRune函数,但那感觉像是一种沉重的方法。
编辑
我比较了三种方法。所有方法都使用循环从bufio.Reader或bufio.Scanner中提取内容。
- 使用
.ReadRune
在bufio.Reader
上循环读取符文。检查从调用.ReadRune
返回的错误。 - 在调用
.Split(bufio.ScanRunes)
后,从bufio.Scanner
中读取字节。在每次迭代中调用.Scan
和.Bytes
,检查.Scan
调用是否有误。 - 与#2相同,但是使用
.Text
从bufio.Scanner
中读取文本而不是字节。我使用strings.Join([]strings, "")
连接字符串切片来形成最终的文本块,而不是使用string([]runes)
连接符文切片。
对于一个23 MB的json文件,每个方法运行10次的时间如下:
0.65秒
2.40秒
0.97秒
看起来ReadRune
还不错。它还可以减少调用次数,因为每个符文只需要一个操作(.ReadRune
)就可以获取,而不是两个操作(.Scan
和.Bytes
)。
ScanRunes
提供的)。另外,我还需要将字符串强制转换为符文以检查字符序列,然后将符文转回字符串以保存部分输出。类似于我链接到的第一个示例,但使用bufio更好。真正的答案是它闻起来有些可笑 - 对于应该非常简单的事情来说过于复杂了一点。 - turtlemonvhRead
或ReadBytes
这样的东西将文件读取到字节数组中,然后在此之后将其分成符文。我认为如果我那样做可能会遇到问题。但是看看那些以字节为输入并提取符文的函数,它们似乎无论如何都会抱怨输入无效,所以我可能过早地担心了这个问题。 - turtlemonvh