2011-06-20 7 views
3

"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クエリを送信する方法はありますか?

+2

このコメントは、4つのコアを使用して1つのデータベースでクエリを吐いても、データベース自体がそれ以上速くなることはありません。データベースがボトルネックになっている場合は、より速く(並行して)クエリを実行する方法を見つけることで、結果をより速く得ることはできません。すでにこれを行っているかもしれませんが、クエリーをスレッド化する時間を無駄にする前にデータベースがうまくいくかどうかを判断する方法を見つけなければなりません。 – DavidO

+0

David0が正しいです。複数のコアを使用すると、プロセッサに束縛されたタスクは高速化されますが、データベースのクエリ処理はほとんどの場合この請求書に適合します。 –

+0

ご意見ありがとうございます。しかし、私はデータベースクエリを高速化するために 'foreach'ループ構造を使用しません。私は、複数のコアがクエリの結果の演算を高速化する必要があります。上記のコードは含まれていませんでした。なぜなら、foreachはSQLクエリ自体に失敗しているからです。 – rajesh

答えて

0

私の提案は次のとおりです。 データベースクエリをループ外に移動し、アクセスをロックすると、パラレルデータベースクエリは実行されません。私は並列処理を行うことができるうちに、並列ディスクアクセスを持たないため、速度も上がると思います。

意味(擬似コード) db =データベースに接続 threadlock = lock();

のparfor { threadlock.lock結果= DBクエリ今ちょうどデータである thread.unlock処理結果のデータ((あなたがロックされたデータベースを維持せずにロードしながらカントプロセスとして、ここですべてのデータをプルする)、及びSQLオブジェクトではありません)。 }

関連する問題