#sql #r #postgresql
#sql #r #postgresql
Вопрос:
Я пытаюсь получить доступ к моей PostgreSQL-базе данных из R, используя RpgSQL.
Моя база данных очень большая, а запросы довольно сложные. Поэтому я понимаю, что мне нужно немного подождать.
Однако, если я использую pgAdmin III в качестве клиента, запрос занимает, возможно, 5 секунд. Когда я использую RpgSQL, один и тот же запрос буквально занимает целую вечность.
Я не вижу причины для этого, поскольку сервер, а не клиент, должен выполнять работу, верно?
Можете ли вы назвать мне причину и, возможно, решение?
Спасибо!
Комментарии:
1. Вы могли бы попробовать использовать RODBC и посмотреть, будет ли это быстрее. Номер версии RpgSQL 0.1-5 пока не кажется мне очень зрелым.
2. Спасибо. Возможно, вы правы, но RODBC кажется очень сложным в установке (тем более, что у меня нет прав администратора на моем рабочем компьютере — грустно, но это правда)
3. Вы можете создать «User DSN» в Windows, для которого вам не нужны права администратора, с помощью «Настройка источников данных (ODBC)» на панели управления. Ах, но для этого вам нужен драйвер MySQL ODBC, а для установки драйвера требуются права администратора … извините! И вы на самом деле работаете в Windows?
4. Сколько данных вы на самом деле вводите? Возможно, добавьте
LIMIT
предложение в SQL, чтобы проверить, действительно ли это работает. Вполне возможно, что способ, которым R должен читать / анализировать / декодировать ваши данные в понятные ему вещи, — это то, что занимает все время. Если все остальное не удается, профилируйте свой код, чтобы увидеть, где R занимает все время.5. Это потому, что он основан на RJDBC.
Ответ №1:
Существует также пакет RPostgreSQL, который активно поддерживается. Поскольку он находится непосредственно поверх API PostgreSQL, он должен быть быстрее, чем переход через ODBC с RODBC.
Вот краткий пример из базы данных, которую я храню дома — она получает тысячу простых строк за десятую долю секунды:
R> library(RPostgreSQL)
Loading required package: DBI
R> drv <- dbDriver("PostgreSQL")
R> con <- dbConnect(drv, password="....", dbname="beancounter")
R> system.time(res <- dbGetQuery(con,
> "select * from fxprices where date >= '2005-01-01' limit 1000"))
user system elapsed
0.030 0.000 0.113
R> dim(res)
[1] 1000 8
R>
Комментарии:
1. спасибо, Дирк! Я читал, что вы являетесь сопровождающим RPostgreSQL. На самом деле я хотел бы использовать RPostgreSQL, но, похоже, его сложно установить на компьютер с Windows x32 !?