运行 randomForestSRC 后 RODBC 失去连接

Posted

技术标签:

【中文标题】运行 randomForestSRC 后 RODBC 失去连接【英文标题】:RODBC lose connection after running randomForestSRC 【发布时间】:2014-09-15 20:55:36 【问题描述】:

我通过 RODBC 打开到 Vertica 的连接,然后从 randomForestSRC 包运行 rfsrc 函数,然后连接丢失。甚至连线的事情是,当为某些数据集运行 rfsrc 函数时,连接保持不变,而对于另一些数据集,连接丢失了。

这里是代码:(我使用最新的 randomForestSRC 和 RODBC 包)

library(parallel)
library(randomForestSRC)
library(RODBC)

data(veteran, package = "randomForestSRC")
data(breast, package = "randomForestSRC")
data(pbc, package = "randomForestSRC")
data(wihs, package = "randomForestSRC")
data(follic, package = "randomForestSRC")

db_str <- "**********************"
bi_con <- odbcDriverConnect(db_str, believeNRows=FALSE,rows_at_time=100000)
sql <- "insert into testing123 values('abcd');"
result <- sqlQuery(bi_con, sql)
print(result)
cat("\r\n")

#obj1 <- rfsrc(status ~ ., data = breast, nsplit=10) # lose connection
#obj2 <- rfsrc(Surv(time, status)~., data = veteran, nsplit = 10, ntree = 100) # works
#obj3 <- rfsrc(Surv(days,status) ~ ., pbc, nsplit = 10) # works
#obj4 <- rfsrc(Surv(time, status) ~ ., wihs, nsplit = 3, ntree = 100) # works
#obj5 <- rfsrc(Ozone ~ ., data = airquality) # works
obj6 <- rfsrc(Species ~., data = iris) # lose connection
#obj7 <- rfsrc(Surv(time, status) ~ ., follic, nsplit = 3, ntree = 100) # lose connection

sql <- "insert into testing123 values('abcde')"
result <- sqlQuery(bi_con, sql)
print(result)
odbcClose(bi_con)

目前,我认为这是因为 R 的垃圾收集删除并关闭了数据库连接。有人可以帮忙吗?谢谢。

这里是错误信息:

[1] "HY000 10 [Vertica][VerticaDSII] (10) An error occurred during query preparation: no connection to the server\n"
[2] "[RODBC] ERROR: Could not SQLExecDirect 'insert into testing123 values('abcde')'"                           

这是我在自己的机器上运行的脚本的最低版本

library(randomForestSRC)
library(RODBC)

db_str <- "********************************"
bi_con <- odbcDriverConnect(db_str, believeNRows=FALSE,rows_at_time=1)
sql <- "insert into testing123 values('abcd');"

result <- sqlQuery(bi_con, sql)
print(result)
cat("\r\n")

obj <- rfsrc(Species ~., data = iris) # lose connection

sql <- "insert into testing123 values('abcdef')"
result <- sqlQuery(bi_con, sql)
print(result) # this line will produce the error message above

观察数据集后,conn-break 和 conn-non-break 数据集的区别在于所有破坏 rodbc 连接的数据集都包含一个非数字列(字符串列),而所有数据集保持 rodbc 连接只包含数字列。

最后我使用了 RJDBC,它与 randomForestSRC 包配合得很好

【问题讨论】:

除非实际范围与您的示例不同,否则我认为没有任何理由让垃圾收集发挥作用。您的 rfsrc 调用需要很长时间吗?我每天都使用 RODBC 和 sql server,连接通常会在一段时间后超时 虽然 timeout 没有解释为什么在您的注释代码中第一次调用失败而第二次调用运行?这是准确的,因为我觉得它不是 @DMT 感谢您的回复。这个脚本是我用来运行的完整脚本。 obj1 到 obj7 示例适用于小型数据集,每个示例在 10 秒内运行。 obj1 将导致此行失败结果 所以要非常清楚。如果包含对设置 obj1、obj6 或 obj7 的调用,则 dbConnection 将丢失。然而,如果你只包括调用 obj2-obj6,dbConnection 保持打开状态? @DMT 没有。每一个对连接都有独立的影响,这意味着如果运行中包含obj1,obj6,obj7中的任何一个,连接就会中断。 【参考方案1】:

据我了解,R 垃圾收集没有任何理由会针对您的数据库连接,除非您提供的范围不能指示您实际运行的内容。这可能是影响环境的 rfsrc 调用的一些细微的方面,但我不熟悉那个包。我个人也几乎不可能重现您的问题。

在我看来,有两种可能性。将 rfsrc 调用排除在等式之外,并在它们之后定义您的数据库连接。如果这不可能,您可以执行以下操作作为 hack。您可以在所有 rfsrc 调用之后放置此函数调用。

connectionTest<-function(dbConn)
    newDbConn<-dbConn
    tryCatch(
        result<-odbcGetInfo(dbConn),

        #redefine the db connection if it isn't active
        error=function(e)newDbConn<-bi_con <- odbcDriverConnect(db_str, believeNRows=FALSE,rows_at_time=100000)
    )
    newDbConn

然后你会打电话

  bi_con<-connectionTest(bi_con)

在您的第二次查询之前。

就像我说的,纯粹的 hack,但我无法重现您的问题,并且对 randomForestSRC 包的了解不够,无法给出更好的答案(如果有的话)

【讨论】:

奇怪的是,如果我在 rfsrc 函数之前和之后调用 result 确实如此,如果连接丢失,odbcGetInfo 会抛出错误(这就是为什么我 tryCatched 的原因)。如果在所有 rfsrc 调用之后 odbcGetInfo(bi_con) 没有抛出错误,这似乎意味着连接仍然打开,至少从 R 端,但可能不是从服务器端。你为什么将believeNRows 设置为FALSE?我会用简单的连接信息(db_str)给呼叫一个镜头,让其他一切都默认 我现在使用 odbcDriverConnect(db_str),但它会产生同样的错误。我不确定它是 R 端还是服务器端,因为某些数据集可能会保持连接,其中一些可能会破坏它。这是我无法理解的部分。所有的数据集都很小(几百行) 你试过按顺序调用数据库吗?例如,连续两次调用 db。 rfsrc 调用根本没有使用数据库,所以我的感觉是这些调用并没有“破坏”连接,但是服务器可能不允许每个您设置的连接进行多次调用。如果您可以连续两次单独查询数据库,那将反驳我刚才所说的。如果你不能连续调用两次,那么可能是时候看看 db_str 是的,我做到了,我可以进行多次调用,只需注释掉 rfsrc 函数。我在帖子末尾添加了更多信息,我认为 rfsrc 函数中发生了一些事情......

以上是关于运行 randomForestSRC 后 RODBC 失去连接的主要内容,如果未能解决你的问题,请参考以下文章

randomForestSRC 包 R 中的 rfsrc() 命令不使用多核功能

在 R 中按 ID 分类

ue4运行后F8退出

汇编程序运行后,如何查看运行结果

VBS脚本开机后能自动运行吗?

Rstudio作图运行后看不到图如何解决?