dbGetQuery и dbReadTable не могут вернуть действительно большой DBI таблицы

У меня действительно большая таблица (8M строк), которую мне нужно импортировать в R, и я буду выполнять некоторую обработку. Проблема в том, что когда я пытаюсь перенести его в R с помощью пакета DBI, я получаю сообщение об ошибке

Мой код ниже

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 ответ

Решение

Я заставил его работать, используя пакет RPostgreSQL вместо стандартного пакета RJDBC и DBI. Он смог выполнить sendQuery, а затем рекурсивно использовал fetch, чтобы получить данные по 10000 кусочкам.

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)
}
Другие вопросы по тегам