我使用dplyr
在我的数据库中完成了一些复杂的计算,包含一对多的连接,然后过滤结果,这样我就不再真正知道我的计算机内存是否足以收集我的结果了计算,例如
library(dplyr)
tbl(src_con, 'table_name') %>%
inner_join(...) %>%
filter(...) %>%
inner_join(...) %>%
... %>% # more stuff
collect(n = Inf) # will this crash the computer?
有什么方法可以估算得到的tibble是否太大而无法存储?我使用的是dplyr 0.5.0和PostgreSQL 9.5。
答案 0 :(得分:1)
使用compute()
将查询结果存储在临时表中(它不会将数据发送回R)然后询问postgres abt该表:
library(dplyr)
db <- src_postgres("postgres", host="localhost", user="bob")
star <- tbl(db, "AllstarFull")
group_by(star, yearID) %>%
summarise(n=n()) -> res
explain(res)
res_comp <- compute(res, name="temptbl")
tbl(db, sql("SELECT pg_size_pretty(sum(pg_column_size(temptbl))) FROM temptbl")) %>% collect()
## # A tibble: 1 × 1
## pg_size_pretty
## * <chr>
## 1 3317 bytes
tbl(db, sql("SELECT pg_size_pretty(sum(pg_column_size(temptbl))/3) FROM temptbl")) %>% collect()
## # A tibble: 1 × 1
## pg_size_pretty
## * <chr>
## 1 1105 bytes
object.size(collect(res_comp))
## 1896 bytes
为什么除以3?如果在表格范围内完成,pg_column_size()
的计算会产生开销(您必须创建一个查询,将每个列的列大小相加,以避免这种情况)。简单的划分实际上只是对实际规模的估计,但对于政府工作而言,它的速度和速度都很快。
您可以使用此方法在collect()
之前为结果返回大小猜测球场。