R 从数据库中收集大型表时,是否有方法估计所需的内存量?
我使用dplyr在数据库中进行了一些复杂的计算,包含一对多连接,然后过滤结果,因此我不再真正知道我的计算机内存是否足以收集计算结果,例如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
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如果最终太大而无法使用其配置的内存,则会将内容溢出到磁盘。谢谢,这是对您可以在数据库端执行的操作的有用描述。