私はAWSのAthenaデータベースで大規模なデータセットを持っています。ここで私がしようとしています何私は並行して、そこから読みたい、と私はRJDBC
AWSのAthena(AWS)データベースからの並列読み込み、
を使用してい
R.
内からフォークにforeach
パッケージのアプローチに慣れてる:
out <- foreach(i = 1:length(fipsvec), .combine = rbind, .errorhandling = "remove") %dopar% {
coni <- dbConnect(driver, "jdbc:awsathena://<<location>>/",
s3_staging_dir="my_directory",
user="...",
password="...")
print(paste0("starting ", i))
sqlstring <- paste0("SELECT ",
"My_query_body"
fipsvec[i]
)
row <- fetch(dbSendQuery(coni, sqlstring), -1, block = 999)
print(i)
dbDisconnect(coni)
rm(coni)
gc()
return(row)
}
(申し訳ありませんが、私はこれが再現することはできません - 。私は明らかにオンラインDBへの鍵を配ることはできません)
私はこれを実行すると、最初のc = number of cores
のステップが細かい実行されますが、それがハングアップし、何もしない - indefi私が知る限り、ニティエリ。 htop
はいずれのコアでも何の活動も示さない。そして、forループをc
のエントリだけにループするように変更すると、出力が期待通りになります。私がパラレルからシリアルに変更すると(の代わりに%dopar%
)、それはうまく動作します。
これは、接続が正しく閉じられていない、または何らかの形で重複して定義されていることと関連していますか?私は並列ループ内に接続を配置したので、各コアはそれぞれの環境で独自の接続を持つ必要があります。しかし、これが十分に明確であるかどうかを知るためにデータベースについて十分に知りません。
ここでは何が起こっているのかを理解するのに役立つ回答をいただければ幸いです。
。私の経験では、これはWindowsマシンでのみ重要です。そして、とにかく、4コアのインスタンスで4つのエントリをループすると、並列スクリプトがうまく動作します。したがって、各スレッドは1回のみの反復を実行できます。今のところドライバーを動かそうとしています... –
もう1つの手順として、 '.jinit(force.init = TRUE)'行を%dopar%環境の最初の行に含めてください。 (しかし、私はこの時点で本当にちょうどボールを振っていますが、自分自身のJava側のロックをしっかりと理解していない) –
ドライバーコールの内部を動かすことは役に立ちません。今すぐ 'harmonize'ブランチを試してみます - これを並行してやろうとしているのは、大きなチャンクをメモリに読み込もうとするとエラーが出るということです。私は約1e5行しか持っていませんが、私は3000列あり、それらのほとんどが必要です。 –