"foreach"を使用してCPUのすべてのコアをuitlizeしようとします。 catchは、ループ内でSQLクエリを送信する必要があります。スクリプトは通常の 'for'ループで正常に動作していますが、 'foreach'に変更すると次のエラーが発生します。 エラーは次のとおりです。"foreach"ループ:R内のすべてのコアを使用する(特にforeachループ内でSQLクエリを送信する場合)
select: Interrupted system call
select: Interrupted system call
select: Interrupted system call
Error in { : task 1 failed - "expired MySQLConnection"
私が使用したコードです。「foreachの」の他のすべての目的のために私のシステムで正常に動作しているものの
library(foreach)
library(doMC)
library(RMySQL)
library(multicore)
registerDoMC(cores=6)
m <- dbDriver("MySQL", max.con = 100)
con <- dbConnect(m, user="*****", password = "******", host ="**.**.***",dbname="dbname")
list<-dbListTables(con)
foreach(i = 1:(length(list))%dopar%{
query<-paste("SELECT * FROM ",list[i]," WHERE `CLOSE` BETWEEN 1 AND 100",sep="")
t<-dbGetQuery(con,query)
}
、それだけで、SQLクエリの場合にエラーを与えています。 'foreach'ループ内でsqlクエリを送信する方法はありますか?
このコメントは、4つのコアを使用して1つのデータベースでクエリを吐いても、データベース自体がそれ以上速くなることはありません。データベースがボトルネックになっている場合は、より速く(並行して)クエリを実行する方法を見つけることで、結果をより速く得ることはできません。すでにこれを行っているかもしれませんが、クエリーをスレッド化する時間を無駄にする前にデータベースがうまくいくかどうかを判断する方法を見つけなければなりません。 – DavidO
David0が正しいです。複数のコアを使用すると、プロセッサに束縛されたタスクは高速化されますが、データベースのクエリ処理はほとんどの場合この請求書に適合します。 –
ご意見ありがとうございます。しかし、私はデータベースクエリを高速化するために 'foreach'ループ構造を使用しません。私は、複数のコアがクエリの結果の演算を高速化する必要があります。上記のコードは含まれていませんでした。なぜなら、foreachはSQLクエリ自体に失敗しているからです。 – rajesh