我有一些要解析的大型json文件,我想避免一次将所有数据加载到内存中。我想要一个可以一次返回每个字符的函数/循环。
我发现这个示例可以遍历字符串中的单词,而bufio包中的ScanRunes函数似乎可以一次返回一个字符。我也有ReadRunebufio提供的功能,大多数情况下都可以正常工作,但是感觉很沉重。
ReadRune
我比较了3种方法。全部使用循环从bufio.Reader或bufio.Scanner中提取内容。
.ReadRune
bufio.Reader
bufio.Scanner
.Split(bufio.ScanRunes)
.Scan
.Bytes
.Text
string([]runes)
strings.Join([]strings, "")
在23 MB的json文件上运行10次的时间是:
0.65 s
2.40 s
0.97 s
所以看起来ReadRune毕竟还算不错。由于每个符文都以1个操作(.ReadRune)而不是2(.Scan和.Bytes)提取,因此它也导致较小的详细调用。
只需在循环中逐一读取每个符文… 参见示例
编辑 :为后代添加代码,以防链接消失:
package main import ( "bufio" "fmt" "io" "log" "strings" ) var text = ` The quick brown fox jumps over the lazy dog #1. Быстрая коричневая лиса перепрыгнула через ленивую собаку. ` func main() { r := bufio.NewReader(strings.NewReader(text)) for { if c, sz, err := r.ReadRune(); err != nil { if err == io.EOF { break } else { log.Fatal(err) } } else { fmt.Printf("%q [%d]\n", string(c), sz) } } }