R 从数据库中收集大型表时,是否有方法估计所需的内存量?

R 从数据库中收集大型表时,是否有方法估计所需的内存量?,r,postgresql,dplyr,R,Postgresql,Dplyr,我使用dplyr在数据库中进行了一些复杂的计算,包含一对多连接,然后过滤结果,因此我不再真正知道我的计算机内存是否足以收集计算结果,例如 library(dplyr) tbl(src_con, 'table_name') %>% inner_join(...) %>% filter(...) %>% inner_join(...) %>% ... %>% # more stuff collect(n = Inf) # wil

我使用dplyr在数据库中进行了一些复杂的计算,包含一对多连接,然后过滤结果,因此我不再真正知道我的计算机内存是否足以收集计算结果,例如

library(dplyr)
tbl(src_con, 'table_name') %>%
    inner_join(...) %>%
    filter(...) %>%
    inner_join(...) %>% 
    ... %>% # more stuff
    collect(n = Inf) # will this crash the computer?
什么是一种有效的方法来估计生成的TIBLE是否太大而无法放入内存?我使用的是dplyr 0.5.0和PostgreSQL 9.5。

使用compute将查询结果存储在一个临时表中,它不会将数据发送回R,然后向postgres询问该表:

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的计算,则会有开销。您必须创建一个查询,将每列的列大小分别相加,以避免出现这种情况。简单的划分实际上只是对实际规模的估计,但它速度快,足以胜任政府工作


在收集之前,您可以使用此方法猜测结果返回大小的大致值。

Postgres如果最终太大而无法使用其配置的内存,则会将内容溢出到磁盘。谢谢,这是对您可以在数据库端执行的操作的有用描述。