如何跟踪最有可能因服务器调用而导致的错误?

时间:2018-06-04 11:42:32

标签: r

如果您在C:/OSRM_API5/中安装了OSRM API版本5,则下面的可重现示例中的以下循环会产生错误(在randrom时或多或少。上次我运行代码时{{1}我们在3台不同的笔记本电脑上运行代码,并获得以下不同的消息:

  

viaroute5中出错(locs $ x [i],locs $ y [i],locs $ x [j],locs $ y [j]):
  找不到对象'res'另外:警告信息:1:In   file(con,“r”):InternetOpenUrl失败:'Die Serververbindung   konnte nicht hergestellt werden。' 2:在值[3L]中:达到   已用时间限制[cpu = 1s,elapsed = 1s]

  

options()中的错误:达到已用时间限制另外:警告   消息:在文件中(con,“r”):InternetOpenUrl失败:'死   Serververbindung konnte nicht hergestellt werden。'

  

粘贴错误(“错误输入”,dcall,“:”):达到已用时限

最初我们认为i=17,但现在错误仍然存​​在,尽管setWinProgressBar被注释掉了。

是否有人知道会发生什么或如何追踪此错误?

setWinProgressBar

评论1
如果我用一些微不足道的东西替换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) ,例如viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2])错误消失了(当然)。

评论2 当我从`i = 17开始时,它看起来像

i+j

1 个答案:

答案 0 :(得分:2)

我认为这是因为请求比OSRM更快地处理它们。这导致完整的OSRM请求队列,最后导致怪异的错误消息。有关部分说明,请参阅here

使用github上的最新OSRMR版本,您不应再出现此类错误。在v0.1.31我更改了viaroute包的OSRMR功能,通过添加新的可选参数timeout来解决此问题。 timeout默认情况下将viaroute调用置于睡眠状态1 ms。 timeout也可以调整。

您可以使用以下命令从github安装最新的OSRMR版本。

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()