【问题标题】:dbGetQuery and dbReadTable failing to return a really large table DBIdbGetQuery 和 dbReadTable 未能返回一个非常大的表 DBI
【发布时间】:2018-02-07 15:29:35
【问题描述】:

我有一个非常大的表(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,它们都给出了相同的错误。

任何帮助将不胜感激!

【问题讨论】:

  • "SELECT * FROM my_table FETCH FIRST 1000 ROWS ONLY;" ?
  • 嘿@DavidKlotz 如果我对数据进行子集化,我可以获取数据,但我想要数据框中的整个卡盘(所有 8M 行)。这只会让我得到 1000 行
  • 好吧,您只是没有足够的内存来执行此操作:)。查看dbplyr 包,它将允许您从 R 中在服务器端执行一些预处理操作,因此您只能将合理数量的数据带到 R
  • 不过,8M 行并不算多,所以请检查 David 的建议,看看至少它是否有效

标签: r rjdbc r-dbi


【解决方案1】:

我通过使用 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)
}

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多