我正在尝试处理一个日志文件,其中每一行看起来像这样:
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
循环中的 s ——为简洁起见,我省略了它。 google-pprof
表示大部分时间都花在strings.Fields
、和strings.FieldsFunc
上。unicode.IsSpace
runtime.stringiter2
我怎样才能让它运行得更快?