我必须导入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
,而仅包含第一次迭代的结果。
答案 0 :(得分:0)
在并行处理中,将生成部分结果并将其“保存”到不同的对象,并且仅在最后合并时才保存。因此,问题在于将数据保存到对象。
我找到了一种适用于较少数量变量的解决方案
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