2014-09-15 2 views
1

Открываю соединение с Vertica через RODBC, затем запускаю функцию rfsrc из пакета randomForestSRC, после чего соединение теряется. Даже проводная вещь заключается в том, что при запуске функции rfsrc для некоторого набора данных соединение поддерживалось, а для некоторых других соединение терялось.RODBC потеряет соединение после запуска randomForestSRC

Вот код: (я использую последнюю версию пакета 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 

После наблюдения набора данных, disfference между соединительными и неразрывными наборами данных состоит в том, что весь набор данных, который разрушает соединение rodbc, содержит нечетный столбец (колонку строк) и весь набор данных, которые поддерживают стержень Соединение bc содержит только числовой столбец.

Finaly Я использую RJDBC и он хорошо работает с randomForestSRC пакетом

+0

если не фактический обзорный ISN» t, как в вашем примере, нет никакой причины, по которой я вижу, чтобы сбор мусора вступил в игру. Ваши вызовы rfsrc занимают очень много времени? Я ежедневно работаю с RODBC и SQL-сервером, а соединения обычно тайм-аут после некоторой длины – DMT

+0

, хотя тайм-аут не объясняет, почему в вашем прокомментированном коде первый вызов завершается неудачно, но второй вызов выполняется? Это точно, потому что я чувствую, что это не – DMT

+0

@DMT спасибо за ответ. Этот сценарий является полным, который я использую для запуска. Примеры obj1 to obj7 работают с небольшим набором данных и работают в течение 10 секунд для каждого из них. Obj1 приведет к отказу этой строки <- sqlQuery (bi_con, sql) и obj2 не будет. – user1754197

ответ

0

В моем понимании нет никаких причин, почему сбор мусора R будет предназначаться подключением к БД, если вы обзорная представлены не является указывая на то, что вы на самом деле работаете. Это может быть некоторый нюансный аспект вызовов rfsrc, которые влияют на среду, но я не знаком с этим пакетом. Для меня лично невозможно воспроизвести вашу проблему лично.

Есть две возможности с моей точки зрения. Выполните вызовы rfsrc из уравнения и определите соединение с базой данных после них. Если это невозможно, вы можете сделать следующее как взломать. Вы поместите этот вызов функции после всех вызовов 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) 

до вашего второго запроса.

Как я уже сказал, чистый хак, но я не могу воспроизвести вашу проблему и не знаю достаточно о пакете randomForestSRC дать лучший ответ (если есть один)

+0

Странно то, что если я вызову результат <-odbcGetInfo (dbConn), напечатайте (результат) до и после функции rfsrc, они будут давать точный результат (не используя вашу функцию, но напрямую печатать dbinfo), но запрос после Функция rfsrc не работает, не уверен, что это дает больше информации. Благодарю . – user1754197

+0

Это действительно, odbcGetInfo выдает ошибку, если соединение потеряно (следовательно, почему я tryCatched). Если odbcGetInfo (bi_con) после всех вызовов rfsrc не выдает ошибку, похоже, что соединение все еще открыто, по крайней мере, со стороны R, но, возможно, не со стороны сервера. Почему вы устанавливаете trustNRows в FALSE? Я дал бы вызов выстрел с просто информацией о соединении (db_str), и пусть все остальное пойдет по умолчанию – DMT

+0

Теперь я использую odbcDriverConnect (db_str), но он создает ту же ошибку. Я не уверен, что это сторона R или серверная сторона, так как некоторый набор данных может поддерживать соединение, некоторые из них могут его сломать. Это та часть, которую я не мог понять. Все наборы данных небольшие (несколько сотен строк) – user1754197