100000行1500変数のファイルから,第一列<=40,第二列>=60,第三列>=70 の条件を満たす行を抽出する。
tidyverse:::read_csv ... 遅い,遅すぎる
library(tidyverse)
system.time({
df <- read_csv("test.csv")
df <- df %>%
filter(X1 <= 40)%>% # X1 <= 40 の行を取り出す
filter(X2 >= 60) %>% # X2 >= 60 の行を取り出す
filter(X3 >= 70) # X3 >= 70 の行を取り出す
write_csv(df, "out.csv")
})
ユーザ システム 経過
39.960 1.574 42.804
AWK で以下のスクリプト
BEGIN{
FS = ","
getline
print $0
}
$1 <= 40 && $2 >= 60 && $3 >= 70
実行
$ time awk -f awk1.awk test.csv > out2.csv
0.571u 0.177s 0:00.75 98.6% 0+0k 0+0io 0pf+0w
AWK の方が,39.960 / 0.571 ≒ 70 倍速いです。
そりゃねえ,read_csv は,4列目から1500列目までの入力を文字列で入力して double で格納してるんだから,無理もないワ
※コメント投稿者のブログIDはブログ作成者のみに通知されます