dbGetQuery和dbReadTable无法返回一个非常大的表DBI

时间:2018-02-07 15:29:36

标签: r rjdbc r-dbi

我有一个非常大的表(8M行),我需要在R中导入,我将在其中进行一些处理。问题是当我尝试使用DBI包将它带入R时出现错误

我的代码在

下面
options(java.parameters = "-Xmx8048m") 
psql.jdbc.driver <- "../postgresql-42.2.1.jar"
jdbc.url <- "jdbc:postgresql://server_url:port"
pgsql <- JDBC("org.postgresql.Driver", psql.jdbc.driver, "`")
con <- dbConnect(pgsql, jdbc.url, user="", password= '')
tbl <- dbGetQuery(con, "SELECT * FROM my_table;")

我得到的错误是

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
Unable to retrieve JDBC result set for SELECT * FROM my_table; (Ran out of memory retrieving query results.) 

我可以理解它,因为结果集太大但我不确定如何批量检索而不是全部一起检索它。我尝试过使用dBSendQuery,dbReadTable和dbGetQuery,它们都会产生同样的错误。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我通过使用RPostgreSQL包而不是默认的RJDBC和DBI包来实现它。 它能够执行sendQuery,然后递归地使用fetch来获取10,000个块的数据。

main_tbl <- dbFetch(postgres_query, n=-1) #didnt work so tried in chunks 
df<- data.frame()
while (!dbHasCompleted(postgres_query)) {
  chunk <- dbFetch(postgres_query, 10000)
  print(nrow(chunk))
  df = rbind(df, chunk)
}