gpt4 book ai didi

mysql - { : task 1 failed - "could not find function "dbGetQuery""中的 FOREACH 循环错误

转载 作者:行者123 更新时间:2023-11-29 03:27:06 27 4
gpt4 key购买 nike

我在 R 中的简单实现方面有很好的实践,但是我不熟悉通过 R 与 SQL 通信以及并行编程(在今天之前没有这两件事的经验)。我根据博客、论坛等的提示编写了以下代码。

library(doParallel) 

library(RMySQL)

library(DBI)

library(foreach)

cl <- makeCluster(12)

registerDoParallel(cl)

Postcodecsv <- read.csv("C:/Users/Henry Crosby/Desktop/PostcodeLatLong.csv")

mydb = dbConnect(MySQL(), user='****', password="******* ****",

dbname='population_distance', host='****.**.*.*')

dbListFields(mydb,'Postcodes')

foreach (a = 1:120000, .combine="rbind") %dopar% {

Done <- dbGetQuery(mydb, paste("select FID, Postcode2, (6371 * acos( cos(
radians( ",Postcodecsv[a,6],"))*cos(radians(latitude))*cos(radians(Longitude)-radians(",Postcodecsv[a,5],"))+sin(radians(",Postcodecsv[a,6],") )* sin( radians( latitude ) ) ) ) AS distance from Postcodes having distance < 2 ORDER BY distance",sep=" "))

write.table(Done,file="C:/Users/Henry Crosby/Desktop/2km.csv",append=TRUE, col.names=FALSE, sep=",")

}

此计算在 for 循环中进行,但需要很长时间(我必须将其应用于大型数据集!)。当我运行上面的代码时,出现以下错误!谁能告诉我为什么会出现错误以及我该如何解决它!

Error in { : task 1 failed - "could not find function "dbGetQuery""

最佳答案

问题是 foreach 正在自动导出 mydb 对象,但它无法正常工作,因为包含套接字连接的对象无法在进程之间序列化和复制。

我建议您使用 clusterEvalQ 函数初始化集群 worker,以便在每个 worker 上创建 mydb。你可以尝试这样的事情:

clusterEvalQ(cl, {
library(RMySQL)
mydb <- dbConnect(MySQL(), user='****', password="******* ****",
dbname='population_distance', host='****.**.*.*')
NULL
})

但是,您仍然需要使用 foreach .noexport="mydb" 选项来阻止 foreach 自动导出 mydb。您还可以使用 foreach .verbose=TRUE 选项来验证哪些对象被自动导出给工作人员。

关于mysql - { : task 1 failed - "could not find function "dbGetQuery""中的 FOREACH 循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34633039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com