我在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列,我需要其中大部分。 –