R: параллельный импорт данных из SQL Server не возвращает данные - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно импортировать данные за 8 лет, где каждый месяц содержит cca. 360.000 наблюдений, и у каждого есть 75 переменных. Данные хранятся в SQL Server.

Я пытался импортировать его из года в год по этому коду, но окончательный фрейм данных не создан. Кроме того, r должно соответствовать всем годам, но каждое значение одинаково.

Это мой код:

library(foreach)
library(doParallel)

numCores <- detectCores()

system.time({
  nr_years <- 8
  start_year <-  2010
  registerDoParallel(numCores)

  steps <- foreach::foreach(icount(nr_years), .combine = rbind) %dopar% {
    next_year <- start_year +1 
    date_before <- paste0(start_year, '-12-31', sep = '')
    date_end <- paste0(next_year, '-12-31', sep = '')

    myQuery <- RxSqlServerData(sqlQuery = sprintf("SELECT DATE,CLIENT_NO,MAT_ST
                           FROM DBO.DATA_TABLE 
                           WHERE DATE >='%s' and DATE <= '%s'", date_before, date_end), connectionString = connStr, returnDataFrame = TRUE)

    my_df <- rxImport(myQuery)
    #start_year <- start_year + 1 

  }
})

Я протестировал код, заменив %dopar% на %do%: кадры данных не были объединены, но переписаны (объект steps был верным).

Однако я хочу, чтобы данные импортировались параллельно, и в конце все годы должны быть связаны в фрейме данных my_df.

Примечание

Я обнаружил, что в случае %dopar% результаты последней строки функции foreach сохраняются в steps (поэтому я прокомментировал последнюю строку). Однако данные по-прежнему не rbinded, а содержат только результаты первой итерации.

1 Ответ

0 голосов
/ 09 апреля 2019

При параллельной обработке получаются частичные результаты, которые «сохраняются» в разных объектах и ​​сохраняются только после объединения в конце. Таким образом, проблема заключалась в сохранении данных на объекты.

Я нашел решение, которое работает для меньшего числа переменных

period <- function(it){
  res <- c(paste0(start_year + it, '-12-31', sep = ''), paste0(start_year + 1 + it, '-12-31', sep = ''))

}

system.time({
  numCores <- detectCores()
  start_year <-  2016
  registerDoParallel(numCores)

  raz2 <- foreach(i=0:3, .combine = rbind, .multicombine = TRUE) %dopar% {
    dates <- period(i)
    myQuery <- RxSqlServerData(sqlQuery = sprintf("SELECT DATE,CLIENT_NO,MAT_ST
                           FROM DBO.DATA_TABLE 
                           WHERE DATE >='%s' and DATE <= '%s'", dates[[1]], dates[[2]]), connectionString = connStr, returnDataFrame = FALSE)
    rxImport(myQuery)
  }
})

Однако, если я хочу импортировать 75 переменных, я получаю ошибку:

Ошибка в {: задача 2 завершилась неудачно - «неправильное распределение» Время остановлено на: 34,97 7,33 392,9

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