我有一些要解析的大型 json 文件,并且我想避免将所有数据一次加载到内存中。我想要一个函数/循环,可以一次返回一个字符。
我发现这个例子用于迭代字符串中的单词,而bufio 包中的 ScanRunes函数看起来可以一次返回一个字符。我也有ReadRune
来自 bufio的功能主要工作,但这感觉是一种非常沉重的方法。
我比较了 3 种方法。所有人都使用循环从 bufio.Reader 或 bufio.Scanner 中提取内容。
使用.ReadRune
on a循环读取符文bufio.Reader
。检查调用中的错误.ReadRune
。
bufio.Scanner
在调用.Split(bufio.ScanRunes)
扫描器后从 a 读取字节。调用.Scan
并.Bytes
在每次迭代,检查.Scan
调用错误。
与#2 相同,但bufio.Scanner
使用.Text
.从 a而不是字节读取文本。string([]runes)
我没有加入一片符文,而是加入了一片字符串strings.Join([]strings, "")
以形成最终的文本块。
在 23 MB json 文件上各运行 10 次的时间为:
0.65 s
2.40 s
0.97 s
所以看起来ReadRune
毕竟还不错。它还导致更小、更简洁的调用,因为每个符文都是在 1 个操作 ( .ReadRune
) 而不是 2 个 (.Scan
和.Bytes
) 中获取的。
MMTTMM
千巷猫影
相关分类