有没有办法估计从数据库中收集大型表所需的内存量?

时间:2017-01-11 03:01:12

标签: r postgresql dplyr

我使用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。

1 个答案:

答案 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()之前为结果返回大小猜测球场。