遠く離れた業界強度のデータベースに対して多くの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ライブラリが利用できないようで、CRANで読んだことからわかるように、並列化のために以前のパッケージが並列に置き換えられています(「パッケージ」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を一緒に活用します。つまり、一度に1つのクエリを実行するだけで、データ転送中はCPUがほとんど使用されなくなり、CPUが動作している間はリンクが静かになります。並列クエリでは、データの到着とCPUが同時に動作しているのがわかります。全体として、それははるかに速くなりました。どうもありがとう!
/クリス