ログファイルを処理しようとしています。各行は次のようになります。
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
ます。100 万行のログ ファイルを読み取り、さまざまな期間のパケット数ごとにリストを作成し、それらのリストを並べ替えて、約 3 秒で中央値を計算できる Python スクリプトを用意しました。
私は 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')
}
ループ内で s を実際にチェックしていることに注意してくださいerr
。簡潔にするために省略しました。 は、大部分の時間が、、およびgoogle-pprof
で費やされていることを示しstrings.Fields
ます。strings.FieldsFunc
unicode.IsSpace
runtime.stringiter2
これをより速く実行するにはどうすればよいですか?