Эффективный способ запроса базы данных sqlite с вектором R - PullRequest
2 голосов
/ 28 января 2012

У меня есть вектор значений в R, и я хочу получить ответные значения из базы данных sqlite.Я использую следующий код.

values = c()

for (a in keys)
{
    result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a)
    values = c(values,results)
}

К сожалению, этот код очень медленный.Есть ли более эффективный способ сделать это?

Спасибо,

Йоханнес

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Если aacontent не очень велико, прочитайте все это в R и используйте что-то вроде функции соответствия R, или функции sqldf, или функции data.table

Если aacontent слишком велик для этого, и ключиis small-ish, затем запишите ключи в таблицу sqlite и выполните запрос соединения.Вам может быть полезно создать индекс для одного или обоих из них.

0 голосов
/ 28 января 2012

Это, безусловно, готовые инструменты для таких запросов SQL от R (поскольку вы используете SQLite, я обязательно проверю sqldf ), но на своем опыте я просто заканчиваюдо написания множества маленьких вспомогательных функций-оболочек для построения запросов.

Например, в вашем случае ваша проблема на самом деле не в части R, а в том, что вы хотите свернуть все значения в keys водин запросТаким образом, вы хотите запрос, который будет выглядеть примерно так:

SELECT content FROM aacontent WHERE Id IN (val1,val2,...)

, а затем трюк использует paste в R для построения предложения IN.Я просто использую простую функцию-обертку в dbGetQuery, которая использует аргумент ... и paste для сшивания запросов из разных частей.Примерно так:

myQuery <- function(con,...){
    arg <- list(...)
    res <- dbGetQuery(con,paste(arg,collapse = ""))
    res
}

Чтобы было легче соединить вещи при использовании предложений IN:

myQuery(con,"SELECT content FROM aacontent WHERE Id IN (",
             paste(keys,collapse = ","),"))

Обратите внимание, что это немного сложнее, если значения в keys - это символы, с тех пор вам нужно проделать еще некоторую работу с paste, чтобы получить одинарные кавычки вокруг каждого элемента, но это не так уж много работы.

Этот совет более уместен, если БД ввопрос довольно маленький;если вы имеете дело с большими данными, вероятно, стоит рассмотреть предложения Spacedman.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...