airquality を 100000 倍した CSV データ(15300000行)の Month ごとの Temp の平均値を求める
R でやるなら,
> system.time({a <-read.csv("aq"); print(by(a[,4], a[,5], mean))})
a[, 5]: 5
[1] 65.54839
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 6
[1] 79.1
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 7
[1] 83.90323
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 8
[1] 83.96774
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 9
[1] 76.9
ユーザ システム 経過
47.388 1.475 48.647
> nrow(a)
[1] 15300000
と,47 秒もかかる(入力時間がほとんど)
> system.time({print(by(a[,4], a[,5], mean))})
a[, 5]: 5
[1] 65.54839
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 6
[1] 79.1
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 7
[1] 83.90323
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 8
[1] 83.96774
------------------------------------------------------------------------------------------------------------------------
a[, 5]: 9
[1] 76.9
ユーザ システム 経過
1.583 0.361 1.923
つまり,47 秒の 97% が入力に必要な時間。
AWK で書いたら,
$ cat a.awk
BEGIN { FS = "," }
NR > 1 { x[$5] += $4; n[$5]++ }
END {
for (i in x) print i, x[i]/n[i]
}
のように,簡単なスクリプトで,
$ time gawk -f a.awk aq
5 65.5484
6 79.1
7 83.9032
8 83.9677
9 76.9
17.274u 0.141s 0:17.43 99.8% 0+0k 0+0io 3pf+0w
と,ほぼ 3 倍速である。
※コメント投稿者のブログIDはブログ作成者のみに通知されます