Как отследить ошибку, скорее всего, из-за вызова сервера? - PullRequest
0 голосов
/ 04 июня 2018

Если вы установили OSRM API версии 5 в C:/OSRM_API5/, следующий цикл в приведенном ниже воспроизводимом примере генерирует ошибку (более или менее во время рандома. В последний раз, когда я запускал код, это было, когда i=17. Мы запустиликод на 3 разных ноутбуках и получите следующие разные сообщения:

Ошибка в viaroute5 (locs $ x [i], locs $ y [i], locs $ x [j], locs $ y[j]):
объект 'res' не найден. Дополнительно: Предупреждающие сообщения: 1: В файле (con, "r"): сбой InternetOpenUrl: 'Die Serververbindung konnte nicht hergestellt werden.' 2: В значении [3L]: достигнуто истекшее ограничение по времени [cpu = 1 с, затрачено = 1 с]

или

Ошибка в параметрах (): достигнуто истекшее ограничение времени Дополнительно: Предупреждение:В файле (con, «r»): InternetOpenUrl не удалось: «Die Serververbindung konnte nicht hergestellt werden.»

или

Ошибка вставки («Ошибка в»,dcall, ":"): достигнут истекший срок

Первоначально мы думали, что setWinProgressBar, но теперьошибка остается, хотя setWinProgressBar закомментировано.

Кто-нибудь знает, что происходит или как отследить эту ошибку?

viaroute5 <- function(lat1, lng1, lat2, lng2, instructions) {
  address <- "http://localhost:5000"
  request <- paste(address, "/route/v1/driving/",
                     lng1, ",", lat1, ";", lng2, ",", lat2,
                     "?overview=false", sep = "", NULL)

  R.utils::withTimeout({
    repeat {
      res <- try(
        route <- rjson::fromJSON(
          file = request))
      if (class(res) != "try-error") {
        if (!is.null(res)) {
          break
        } else {
          stop("???")
        }
      }
    }
  }, timeout = 1, onTimeout = "warning")

  if (res$code == "Ok") {
      return(res$routes[[1]]$duration)
    } else {
      t_guess <- 16*60
      warning("Route not found: ", paste(lat1, lng1, lat2, lng2, collapse = ", "),
              ". Time set to ", t_guess/60 , " min.")
  }
}


n <- 1e3 # ................................... if set to 10, everything is fine!
locs <- data.frame(x = c(47.424536, 47.427061),
                   y = c(9.365103, 9.365062), stringsAsFactors = FALSE)

# pb <- winProgressBar(title = "Test",
#                      label = "0% done", min=0, max=100, initial=0)
wd <- getwd()
setwd("C:/OSRM_API5")
shell(paste0("osrm-routed ", "switzerland-latest.osrm", " >nul 2>nul"), wait = F)
Sys.sleep(3) # OSRM needs time
setwd(wd)
for (i in 1:n) {
  print(i)
  # info <- paste0("done ", round(i/nrow(locs)*100, 1), "%")
  # setWinProgressBar(pb, i/nrow(locs)*100, label = info)
  for (j in 1:n) {
    viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2])
  }
}
shell("TaskKill /F /IM osrm-routed.exe >nul 2>nul")
# close(pb)

Комментарий 1
Если я заменю viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2]) чем-то тривиальным, например, i+j, ошибка исчезнет (конечно).

Комментарий 2 Когда я начал с `i = 17, это выглядело как

[1] 17
Error in file(con, "r") : reached elapsed time limit
Error in file(con, "r") : reached elapsed time limit
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
Error in readLines(file, warn = FALSE) : reached elapsed time limit
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
Error in viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2]) : 
  object 'res' not found
In addition: Warning messages:
1: In file(con, "r") :
  InternetOpenUrl failed: 'Die Serververbindung konnte nicht hergestellt werden.'
2: In value[[3L]](cond) : reached elapsed time limit [cpu=1s, elapsed=1s]

1 Ответ

0 голосов
/ 05 июня 2018

Я думаю, это связано с тем, что запросы поступают быстрее, чем OSRM может их обработать.Это приводит к полной очереди запросов OSRM и, наконец, к появлению жутких сообщений об ошибках.См. здесь для частичного объяснения.

Используя последнюю версию OSRMR от github, вы больше не должны получать такого рода ошибки.В v0.1.31 я изменил функцию viaroute пакета OSRMR, чтобы учесть это, добавив новый необязательный параметр timeout.timeout переводит вызов viaroute в спящий режим на 1 мс по умолчанию.timeout также можно настроить.

Вы можете установить последнюю версию OSRMR с github с помощью:

devtools::install_github("ims-fhs/osrmr")

Мне подходит следующий воспроизводимый пример:

osrmr::run_server("switzerland-latest", "C:/OSRM_API5")

n <- 1e3
locs <- data.frame(x = c(47.424536, 47.427061),
                   y = c(9.365103, 9.365062), stringsAsFactors = FALSE)

for (i in 1:n) {
  print(i)
  for (j in 1:n) {
    osrmr::viaroute(locs$x[1], locs$y[1], locs$x[2], locs$y[2], instructions = FALSE, api_version = 5, localhost = TRUE, timeout = 0.001)
  }
}
osrmr::quit_server()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...