我对远处的行业实力数据库进行了许多 SQL 查询,但接收结果需要很长时间。当我的带有 R 的计算机几乎靠近数据库时,它的速度要快得多,这让我相信这是我的计算机和数据库之间的延迟是瓶颈,并且运行并行查询可能会加快速度。我们在不同的大陆。
这是一个不并行的工作版本:
doQueries <- function(filenameX, inp1, inp2) {
print(paste("Starting:", inp1, inp2, ",saving to", filenameX, sep=" "))
# Here should the query be (using RODBC)
# save(queryresults, file="filenameX")
}
input.rows <- cbind(c("file1.rda","file2.rda","file3.rda"),c("A","B","C"),c(12,13,14))
for (i in 1:nrow(input.rows)) {
doQueries(filenameX=input.rows[i,1], inp1=input.rows[i,2], inp2=input.rows[i,3])
}
我已尝试使用以下代码,但 foreach-library 似乎不可用,正如我从阅读 CRAN 中了解到的那样,parallel 正在替换早期的并行包(“包'foreach'不可用(对于 R 版本 2.15. 0)")。
library(parallel)
library(foreach)
foreach (i=1:nrow(input.rows)) %dopar% {
doQueries(filenameX=input.rows[i,1], inp1=input.rows[i,2], inp2=input.rows[i,3])
}
我应该怎么做呢?
感谢 Stackoverflow 上的所有贡献者!
/克里斯
更新:感谢 nograpes,我设法加载了库。以下代码似乎有效:
library(RODBC)
library(doParallel)
library(foreach)
# odbcCloseAll()
# my_conn <- odbcConnect("database", uid="xx", pwd="yy", case="nochange")
doQueries <- function(filenameX, inp1, inp2) {
print(paste("Starting:", inp1, inp2, ",saving to", filenameX, sep=" "))
# sql.test <- RODBC::sqlQuery(my_conn, "SELECT * FROM zzz LIMIT 100", rows_at_time=1024)
# save(sql.test, file="filenameX")
}
input.rows <- cbind(c("file1.rda","file2.rda","file3.rda"),c("A","B","C"),c(12,13,14))
cl <- makeCluster(3)
registerDoParallel(cl)
foreach (i=1:nrow(input.rows)) %dopar% {
doQueries(filenameX=input.rows[i,1], inp1=input.rows[i,2], inp2=input.rows[i,3])
}
stopCluster(cl)
但是当我包含实际的 SQL 查询时,会出现此错误消息:{ 中的错误:任务 1 失败 - “第一个参数不是开放的 RODBC 通道”
难道这在概念上不起作用?RODBC 一次不能处理多个查询?
我真的很感谢所有的支持。
/克里斯
更新 2:非常感谢 nograpes 提供的非常好的和令人印象深刻的答案。很难判断数据传输本身是否更快(我认为总吞吐量快 20%),但我发现由于查询(大约 100 个)具有不同的响应时间,并且需要后处理(我将其包含在函数中在保存之前),我可以更好地利用链路和本地 CPU。即,当时只有一个查询,CPU 在数据传输过程中几乎没有使用,然后在 CPU 工作时链接将保持安静。通过并行查询,我看到数据到达并且 CPU 同时工作。总的来说,它变得更快了。非常感谢!
/克里斯