我想处理一个日志文件,各行其看起来是这样的:优化围棋文件读取程序
flow_stats: 0.30062869162666672 gid 0 fid 1 pkts 5.0 fldur 0.30001386666666674 avgfldur 0.30001386666666674 actfl 3142 avgpps 16.665896331902879 finfl 1
我感兴趣的pkts
场和fldur
领域。我有一个可以读取百万行日志文件的Python脚本,为所有不同持续时间的每个数据包创建一个列表,对这些列表进行排序,并在大约3秒内找出中位数。
我在玩Go编程语言,我想我会重写这个,希望它能跑得更快。
到目前为止,我一直很失望。只需读取数据结构中的文件大约需要5.5秒。所以我想知道如果你们中有些人能帮助我更快地做到这一点(嘿嘿)。
这里是我的循环:
data := make(map[int][]float32)
infile, err := os.Open("tmp/flow.tr")
defer infile.Close()
if err != nil {
panic(err)
}
reader := bufio.NewReader(infile)
line, err := reader.ReadString('\n')
for {
if len(line) == 0 {
break
}
if err != nil && err != io.EOF {
panic(err)
}
split_line := strings.Fields(line)
num_packets, err := strconv.ParseFloat(split_line[7], 32)
duration, err := strconv.ParseFloat(split_line[9], 32)
data[int(num_packets)] = append(data[int(num_packets)], float32(duration))
line, err = reader.ReadString('\n')
}
请注意,我居然在循环检查err
秒 - 我省略了,对于简洁。 google-pprof
表示大部分时间花费在strings.Fields
之前strings.FieldsFunc
,unicode.IsSpace
和runtime.stringiter2
。
如何让此运行更快?
为K:=范围SORTKEYS(数据)=>为_,K:=范围SORTKEYS(数据) –
尼斯的答案!谢谢。 :-) –
@ Ekkehard.Horner:对,你是。它似乎在这种情况下正常工作,因为索引和值都从零开始。谢谢。 – markc