【问题标题】:Retry for-loop R loop if error如果错误,重试 for-loop R 循环
【发布时间】:2015-08-14 07:06:46
【问题描述】:

我有一个 R For 循环,它从服务器下载数据并将结果添加到表中,但是,有时我会在停止循环时遇到错误。如果我告诉它重做上次下载并继续,它会在下一个错误之前再工作一段时间。 错误与代码或数据无关,而是随机的;有时它会运行 2.5 小时,有时它会在 45 分钟后停止下载相同的数据
如果出现错误并重试,有没有办法让我的循环后退一步? 例如。在

for (i in 1:1000){
    table[i,] <- downloadfnc("URL", file = i)
}

假设我在下载 i=500 时遇到错误,我要做的就是修复:

for (i in 500:1000){
    i <- i + 499     #since i starts at 1, 499+1=500
    table[i,] <- downloadfnc("URL",file = i)
}

然后即使上次出错,它也会下载文件“500”。 有没有办法可以自动化它,这样如果出现错误,它会后退一步(i-1)并重试(可能会延迟几秒钟)?

(使用 R 只用了几个星期,所以请简单谈谈)

【问题讨论】:

  • 似乎是内存问题。
  • downloadfnc 究竟返回了什么?
  • downloadfnc(我起了名字,它实际上是 'DODSGrab')返回一个正式的类 SpaatioTemporalDataFrame(与一些数据坐标)。但我简化了问题的代码。 -- N8TRO,我不认为这是内存问题,因为我只下载了几kb的数据,接收数据需要几秒钟,我会覆盖以前的下载。我认为这与服务器有关。

标签: r for-loop download repeat


【解决方案1】:

你可以抛出一个尝试接住的组合。

for (i in 1:1000){
    while(TRUE){
       df <- try(downloadfnc("URL", file = i), silent=TRUE)
       if(!is(df, 'try-error')) break
    }
    table[i,] <- df
}

这将在while循环中继续,直到文件成功下载,并且只有在成功下载后才会继续。

【讨论】:

  • 我会在晚上试一试,看看效果如何。会更新。
  • 这个循环是否有可能发出过多的请求并导致服务器过载? (我有一些奇怪的症状)......所以它似乎工作,它已经运行了大约 8.5 小时。前 3 个很棒(完成了 60% 的任务)。但在那之后,利率急剧下降(接下来的 5 小时内下降了 6%)。我在大约 6 小时后检查了服务器的速度,它对我和达拉斯(测试)的速度下降了相同的数量(使用了webpagetest.org)。 8 小时后,我的速度下降到 5 分钟/负载,而达拉斯是 300 毫秒。现在我的速度在几秒到 5 分钟之间波动。
  • 不完全确定,但这些症状听起来不像是与 R 相关的问题。服务器应该能够得到相当多的 ping,所以 1000 个工作根本不应该征税。您是否目睹任何与 RAM 相关的问题?这些下载有多大?您的本地计算机可能会陷入困境,您可能希望将文件写入本地,而不是将它们全部存储在 RAM 中,但如果不是,服务器就会出现问题。
  • 文件不超过几 kbs(10 x 4 DataFrame)。早上好像没问题(回到3s/下载)。我在想,如果在下载失败或通过服务器之前,While 循环在连接过程中循环,可能会被许多用户感知(我不知道这是否合理)。但最后几个小时很好。
猜你喜欢
  • 2015-08-20
  • 2018-05-08
  • 2011-06-21
  • 2014-04-03
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多