【问题标题】:How to recover from timeout error in MODISTools如何从 MODISTools 中的超时错误中恢复
【发布时间】:2018-06-22 00:03:46
【问题描述】:

感谢使用 MODISTools 下载时空匹配的图像。具体来说,MODISTools 正在查找由另一颗卫星进行的一百万个相关观测的叶面积指数。正如警告的那样,NASA 服务器会定期超时。

当这种情况发生时,我希望 r 捕获错误,稍等片刻(如果需要),然后再试一次。我知道等待不需要超过几秒钟,因为我正在运行多个实例,并且一次只有一个或两个超时。一旦检测到错误,可以通过重试相同的步骤来恢复处理,或者,具有基本相同的效果,通过重新启动下面粘贴的序列。有没有一种简单的方法可以做到这一点?如果它涉及从 r 调用服务器命令,请为无知者写下您的答案!

这是一个示例,但如果没有超时,它不会说明太多。为简单起见,我显示了固定的位置和日期。在实际运行中,它们派生自 my.chunk 数据帧中的其他字段。

 look.these.up <- which(is.na(my.chunk$lai))
 for (m.obs in look.these.up) {
      junk <- mt_subset(product = "MOD15A2H", lon = 5, lat = 5,
           start = "2017-01-01", end = "2017-01-08")
      my.chunk$lai[m.obs] <- junk$data[, "data"][5] 
 }

【问题讨论】:

    标签: r error-handling


    【解决方案1】:

    这对我有用。我抬头看了看.How can I view the source code for a function?如何查看mt_subset命令背后的代码,修改了一下。

    由于我需要的 MODIS 数据子集有限,因此可以进行一些简化,例如在 for 循环之外创建 all.dates 并删除大部分输入错误检查。

     for (m.obs in 1:n.obs) {
        modis.date <- all.dates[which(all.dates$calendar_date <= 
           ret.date & all.dates$calendar_date >= (ret.date - 7)), 1][1]
    
     ## Retrieve the MODIS values for the obs time & place
     m.response <- httr::GET(
        url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
        query = list(latitude = my.chunk$lat[m.obs], 
           longitude = my.chunk$lon[m.obs],   
           startDate = modis.date, endDate = modis.date,
           kmAboveBelow = 0, kmLeftRight = 0),
        httr::write_memory())
        ## If connection fails, try it again up to 10 times.   
        attempts = 0
        while (httr::http_error(m.response)) {
           attempts = attempts + 1
           print(paste0("retry # ", attempts))
           if (attempts >= 10) {
              stop()
              m.response <- NULL
           } 
           Sys.sleep(1) # seconds
           m.response <- httr::GET(
              url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
              query = list(latitude = my.chunk$lat[m.obs], 
                 longitude = my.chunk$lon[m.obs],   
                 startDate = modis.date, endDate = modis.date,
                 kmAboveBelow = 0, kmLeftRight = 0),
              httr::write_memory())
        }   
       modis.vals <- jsonlite::fromJSON(httr::content(m.response,
          "text", encoding = "UTF-8"), 
           simplifyVector = TRUE)$subset[, "data"]  # decodes returned data
       my.chunk$fpar[m.obs] <- modis.vals[[6]] # fPar
    
       etc.
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2011-04-15
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多