2015-08-05 1 views
0

Я использую R и rmongodb для извлечения данных из базы данных MongoDB NoSQL. Я положил в try() логику, чтобы поймать проблемы, возникающие из-за плохих данных. Большую часть времени try() поймал бы ошибку и пропустил бы плохой объект данных. Время от времени, хотя, «не удается» поймать его, и моя программа останавливается. Ниже приведен код, который иногда работает, но не может попасть в if(inherits(...)) время от времени. Я поставил чеки, чтобы убедиться, что iter1 действителен (насколько мне известно) перед вызовом функции mongo.son.iterator.value(). Фактически, я использовал try() по следующим вызовам во всей программе. Я раньше пробовал tryCatch, но я думаю, что результат был тот же. Любая помощь высоко ценится!R rmongodb try() not catching error, потенциально вызванный плохими данными

v2 <- try(mongo.bson.iterator.value(iter1)) 

if(inherits(v2, "try-error")) { 
    cat("mongo.bson.iterator.VALUE(iter1) ERROR ^^^^^^ , next!") 
    Sys.sleep(10) 
    next; 
} 

Выход:

ItemName = VH013269 
before value(iter1) 
type of iter1: integer 
*** caught segfault *** 
address 0x7402cd5, cause 'memory not mapped' 
Traceback: 
1: .Call(".mongo.bson.iterator.value", iter) 
2: mongo.bson.iterator.value(iter1) 
3: doTryCatch(return(expr), name, parentenv, handler) 
4: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
5: tryCatchList(expr, classes, parentenv, handlers) 
6: tryCatch(expr, error = function (e) { 
     call <- conditionCall(e) 
     if (!is.null(call)) { 
      if (identical(call[[1L]], quote(doTryCatch))) 
       call <- sys.call(-4L) 
      dcall <- deparse(call)[1L] 
      prefix <- paste("Error in", dcall, ": ") 
      LONG <- 75L 
      msg <- conditionMessage(e) 
      sm <- strsplit(msg, "\n")[[1L]] 
      w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w") 
      if (is.na(w)) 
       w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L], type = "b") 
      if (w > LONG) 
       prefix <- paste0(prefix, "\n ") 
     } 
     else prefix <- "Error : " 
     msg <- paste0(prefix, conditionMessage(e), "\n") 
     .Internal(seterrmessage(msg[1L])) 
     if (!silent && identical(getOption("show.error.messages"), 
      TRUE)) { 
      cat(msg, file = stderr()) 
      .Internal(printDeferredWarnings()) 
     } 
     invisible(structure(msg, class = "try-error", condition = e)) 
    }) 
7: try(mongo.bson.iterator.value(iter1)) 
8: eval(expr, envir, enclos) 
9: eval(ei, envir) 
10: withVisible(eval(ei, envir)) 
11: source("parcc_mci_v5.R") 
Possible actions: 
1: abort (with core dump, if enabled) 
2: normal R exit 
3: exit R without saving workspace 
4: exit R saving workspace 
Selection: 

ответ

1

try может только поймать ошибок на уровне R. Segfault вы видите потому, что функция .mongo.bson.iterator.value C/C++ обращается к памяти, которой не должно быть.

Вы должны сообщить об этом руководству по упаковке, если это возможно, с воспроизводимым примером.

+0

Спасибо, Джошуа! Ваш ответ подтвердил мое подозрение. Есть ли способ для R справиться с проблемой памяти C/C++? Я довольно сильно застрял. Я должен связаться с сопровождающим Rmongodb, а не с авторами, правильно? –

+0

@ S.Lowe: Да, вы должны сообщить об этом руководству по пакету с воспроизводимым примером, если это возможно. –