2017-01-31 13 views
0

ローカルに保存されたデータベースを照会するためにforeach構文を使用したいと思います。RODBC&foreach

私のコードは以下のようになります。

h <- odbcDriverConnect(connection) 

cl<-makeCluster(no_cores) 
registerDoParallel(cl) 

foreach(i = 1:dim(Table)[1], 
     .combine = rbind, 
     .export = "h", 
     .packages = "RODBC") %dopar% { 
      cat(i,"\n") 
      #h <- odbcDriverConnect(connection) 
      sqlQuery(query) 
     } 

odbcCloseAll() 
stopCluster(cl) 

私は%を使用する代わりに、それが正常に動作%のdoparの%の%を行いますが、私はそれ、私はこのエラーを取得するパラレル作るしようとすると:

Error in { : task 1 failed - "first argument is not an open RODBC channel" In addition: Warning message: In e$fun(obj, substitute(ex), parent.frame(), e$data) : already exporting variable(s): h

私はhをforeachループの内側に置くと動作しますが、1ステップごとに接続を作成することを理解していますので、避けたいと思います。その接続をforeach(他の変数と同じ方法で)にエクスポートする方法はありますか?

+0

*ローカルストアドデータベースを検索するためにforeach構文を使用したいと思っています* ...なぜですか?本当の問題は何ですか?それとも、これを学んでいますか? – Parfait

+0

私はちょうどお互いに関連していないいくつかのクエリーの結果を取得する必要があるので、それは非常に平行な問題です。そのようにすれば結果がより速くなることを願っています。私が間違っている? しかし、それが速くならない場合でもforeachの変数isteadをエクスポートすることが可能かどうかを知りたいです – Swistak

答えて

0

データベース接続を適切にシリアル化およびデシリアライズできないため(ソケット接続などが含まれているため)、データベース接続をエクスポートすることはできません。代わりに、ワーカーで作成する必要がありますが、効率を上げるためには一度作成してforeachループから繰り返し使用する必要があります。

あなたがdoParallelを使用しているので、あなたがclusterEvalQで労働者を初期化することができます:あなたは、あなたのforeachのからhを使用することができます

clusterEvalQ(cl, { 
    library(RODBC) 
    connection <- "???" # how are you setting this? 
    h <- odbcDriverConnect(connection) 
}) 

は、限り、あなたは労働者に自動エクスポートhからforeachのを防ぐようループ:

foreach(i = 1:dim(Table)[1], 
     .combine = rbind, 
     .noexport = "h", # make sure h is *not* exported! 
     .packages = "RODBC") %dopar% { 
    cat(i, "\n") 
    sqlQuery(h, query) 
} 

それは、.noexport="h"を使用することが重要だそう良いhがマスクされ、あなたがRODBCからエラーを取得します。

+0

ありがとうございます!もう1つの質問 - ODBC接続のすべてのインスタンスに空きRAMが必要ですか?それはより小さなデータベースではるかに速く動作しますが、私が大きなものに接続しようとすると、CPUが数分後にアイドル状態になり始め、RAMの不足に結びついていると思います。 – Swistak

+0

@Swistak申し訳ありませんが、特にデータベースやODBCについてよく分かりません。私はあなたのコンピュータ上でプロセス監視ツール(タスクマネージャ?)を実行して、Rセッションが大量のメモリを使用しているかどうかを確認することをお勧めします。 –

+0

@Staveありがとう、私はそれを試しました、unfortunatelly RAM接続によって取られたRAMは、Rの一部または他のプロセスの一部としてタスクマネージャに表示されません(しかし、私は接続を閉じるとRAM使用量が大幅に低下することがわかります)。もう一度foreachパッケージのおかげでありがとう! – Swistak

関連する問題