記事:One Billion Rows Challenge in Golang
10億行をどうやって捌くか
パフォーマンスチューニングの基礎的な内容
やっていることは以下
集計処理の goroutine を分離
ファイル読み込みと処理の分離
float64 の代わりに int64
min/max/sum/count を保存(全生データではなく)
Chunk で読み込む
string の parse 処理の高速化
code:sample.go
func main() {
flag.Parse()
// go tool trace ./profiles/0.0.1.trace
tr, err := os.Create(fmt.Sprintf("./profiles/%s.trace", *version))
if err != nil {
log.Fatal("could not create trace execution profiles: ", err)
}
defer tr.Close()
trace.Start(tr)
defer trace.Stop()
// go tool pprof -http=:8080 ./profiles/0.0.1-cpu.pprof
cpuf, err := os.Create(fmt.Sprintf("./profiles/%s-cpu.pprof", *version))
if err != nil {
log.Fatal("could not create CPU profiles: ", err)
}
defer cpuf.Close()
if err := pprof.StartCPUProfile(cpuf); err != nil {
log.Fatal("could not start CPU profiles: ", err)
}
defer pprof.StopCPUProfile()
// do process
// go tool pprof -http=:8080 ./profiles/0.0.1-mem.pprof
memf, err := os.Create(fmt.Sprintf("./profiles/%s-mem.pprof", *version))
if err != nil {
log.Fatal("could not create memory profiles: ", err)
}
defer memf.Close()
// runtime.GC()
if err := pprof.WriteHeapProfile(memf); err != nil {
log.Fatal("could not write memory profiles: ", err)
}
}