我已成功使用以下代码在R中成功创建到Tsql服务器的并行连接:
sql_retrieve <- function(x){ con <- odbcDriverConnect( 'driver={sql Server};server=OPTMSLMSOFT02;database=Ad_History;trusted_connection=true' ) odbcGetInfo(con) rawData <- sqlQuery(con,paste( "select * from AD_MDL_R_INPUT a where a.itm_lctn_num = ",facility[x] )) odbcClose(con) return(rawData) } cl <- makeCluster(5) registerDoParallel(cl) outputPar <- foreach(j = 1:facility_count,.packages="RODBC") %dopar% sql_retrieve(j) stopCluster(cl)
我希望所有连接都能并行地主动下载,但实际情况是,一次只有一个或两个连接处于活动状态(见下图).这与创建的集群/连接数无关.即使有32个连接,总下载时间也会略微超过1/2(理论上应该接近1/32,对吧?).连接活动之间也有很大的暂停.为什么是这样?我在这里错过了什么?
请记住一些注意事项:
> Tsql服务器和R都在同一台服务器上,因此网络延迟不是问题.
> Tsql服务器允许最多约32k的连接,因此我们不会遇到会话限制问题.
更新7/26/17
再次尝试这个问题,它现在可以工作(代码不变).不确定从现在到最初发布之间发生了什么,但可能对MS sql服务器设置进行了一些更改(不太可能).
拉动790万行的时间遵循下图中的曲线.