現在、計算を行うためにdplyrを使用して関数を作成しています。関数はtbl_sqlオブジェクトを入力すると非常に遅くなりますが、 data.frame を入力するとかなり高速です。
例、
df = data.frame(
a = rnorm(1000000),
b = rnorm(1000000),
c = rep(1:5, 2000000),
d = rep(1:10, 1000000)
)
library(dplyr)
library(MonetDBLite)
library(DBI)
mydb = dbConnect(MonetDBLite())
dbWriteTable(mydb, "df", df, overwrite = T)
dfdb = tbl(mydb, "df")
f = function(d, loc = F){
d = d %>% mutate(i = a*b, ii = a/b)
d2 = d %>% group_by(d) %>% summarise(sum(i)) %>% rename(k = d)
d3 = d %>% group_by(c) %>% summarise(sum(ii)) %>% rename(k = c)
d4 = inner_join(d2, d3, by = "k")
print(d4)
}
system.time(f(df))
1 秒もかかりません。(データフレーム)
system.time(f(dfdb))
約2秒かかります。(tbl_sql)
私の現在の関数は長く、入力データも大きく、(data.frame)は(tbl_sql)オブジェクトよりも 10 倍以上高速であることがわかりました。
何故ですか?誰か説明してくれませんか。