我在AWS上的雅典娜數據庫上有一個很大的數據集。我想從它並行讀取,我習慣了foreach
包的方法來從分叉內R.從雅典娜(AWS)數據庫並行讀取,通過R
我使用RJDBC
這裏就是我想:
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
條目時,輸出結果就是我所期望的。當我從並行切換到串行(%do%
而不是%dopar%
)時,它也可以正常工作。
這是否與連接未被正確關閉或以某種方式被冗餘定義有關?我已將連接放置在並行循環中,因此每個核心都應該在自己的環境中擁有自己的連接。但是我對數據庫知之甚少,無法分辨這是否足夠明顯。
我會很感激的答案,幫助我理解這裏引擎蓋下發生了什麼 - 這一切對我來說都是伏都教。
它不是'.packages'說法。根據我的經驗,這隻對Windows機器很重要。無論如何,當我在4覈實例上循環4個條目時,並行腳本工作正常。所以每個線程都可以執行一次 - 只有一次 - 迭代。現在嘗試移動驅動程序... –
另一個嘗試的步驟可能是將'.jinit(force.init = TRUE)'行作爲%dopar%環境中的第一行。 (但是我真的只是在這個時候吐口水,也不知道自己對java端的瞭解) –
移動驅動程序調用也沒有幫助。現在嘗試使用'harmonize'分支 - 我試圖並行執行此操作的原因是,當嘗試將大塊讀入內存時出現錯誤。我只有大約1e5行,但我有3000列,我需要其中大部分。 –