【问题标题】:Timeout while reading csv file from url in R从R中的url读取csv文件时超时
【发布时间】:2013-10-09 08:53:03
【问题描述】:

我目前在 R 中有一个循环大约 2000 次的脚本(for 循环),并且在每个循环中,它使用 url 链接和read.csv 函数从数据库中查询数据以将数据放入变量中。

我的问题是:当我查询少量数据(大约 10000 行)时,每个循环大约需要 12 秒,而且很好。但是现在我每个循环需要查询大约 50000 行数据,并且查询时间增加了很多,每个循环需要 50 秒左右。这对我来说很好,但有时我注意到服务器发送数据需要更长的时间(≈75-90 秒)并且显然连接超时并且我收到以下错误:

文件中的错误(文件,“rt”):无法打开连接

另外:警告信息:

在文件中(文件,“rt”):无法打开:HTTP 状态为 '0 (nil)'

或者这个:

文件中的错误(文件,“rt”):无法打开连接

另外:警告信息:

In file(file, "rt") : InternetOpenUrl failed: '操作计时 出'

我每次都没有收到相同的警告,它在这两者之间变化。

现在,我想要避免我的程序在发生这种情况时停止,或者只是防止这个超时错误并告诉 R 等待更多时间来获取数据。我在脚本开始时尝试了这些设置作为可能的解决方案,但它一直在发生。

options(timeout=190)
setInternet2(use=NA)
setInternet2(use=FALSE)
setInternet2(use=NA)

还有其他建议或解决方法吗?可能在发生这种情况时跳到下一个循环,并将此错误发生的次数存储在一个变量中,以便最终可以再次查询它,但仅适用于循环中由于以下原因而被跳过的那些i连接错误?当然,理想的解决方案是避免出现此错误。

【问题讨论】:

    标签: r csv timeout


    【解决方案1】:

    使用RCurl 包的解决方案:

    您可以使用

    更改timeout选项
    curlSetOpt(timeout = 200)
    

    或将其传递给getURL的调用

    getURL(url_vect[i], timeout = 200)
    

    使用基础 R 的解决方案:

    只需使用download.file 下载每个文件,然后再担心以后操作这些文件。

    【讨论】:

    • 对于第一个解决方案,我找不到函数 curlSetOpt(),我认为这属于我不使用的额外包。而对于第二种解决方案,我直接使用 read.csv 并将链接作为“文件”,并且此函数没有超时选项。
    • 这些函数来自RCurl。我阅读了 Laszlo 的解决方案,并认为您正在使用该软件包。
    • 作为一种良好做法,最好将下载文件与使用它们分开。 (这样,如果您的处理导致错误,您不必重新下载文件并用尽带宽。)有一个循环调用(仅)download.file,另一个调用read.csv
    • 所以,我按照你的建议使用了 download.file,并结合了我在它似乎工作之前的选项(超时 = 190),做了一个完整的 2150 个循环,持续了 25 小时并且没有超时或任何错误。您可能想要编辑您的答案,以便我可以接受 download.file 使用作为选择的解决方案。非常感谢!
    【解决方案2】:

    我看到这是一篇较旧的帖子,但它仍然出现在 Google 搜索结果列表的前面,所以...

    如果您通过 WinInet(而不是 curl、internal、wget 等)下载,包括超时在内的选项都是从系统继承的。因此,您无法在 R 中设置超时。您必须更改 Internet Explorer 设置。有关详细信息,请参阅 Microsoft 参考资料: https://support.microsoft.com/en-us/kb/181050 https://support.microsoft.com/en-us/kb/193625

    【讨论】:

      【解决方案3】:

      这是我向您展示的部分代码,但您可以根据需要进行修改:

              # connect to website
              withRestarts(
                  tryCatch(
                      webpage <- getURL(url_vect[i]),
                      finally = print(" Succes.")
                  ), 
                  abort = function(){},
                  error = function(e) {
                             i<-i+1
                  }
              )
      

      在我的情况下,url_vect[i] 是我复制信息的 url 之一。这会增加你等待程序完成的时间。

      更新

      tryCatch how to example

      【讨论】:

      • 那么,这会跳过错误并继续下面的循环吗?一开始就没有办法避免错误?
      • 这个选项每次都会重试,如果出错就跳过它。
      • 我相信这是一个 R 互联网配置问题,一定有一些选项或设置导致了这个问题......因为我已经将相同的代码翻译成 Matlab 并且在 Matlab 中我从来没有得到错误做那些冗长的查询和循环。无论如何,我很欣赏这个解决方案,如果没有找到最佳(避免错误)解决方案,我会使用它。
      • 你可能是对的,我使用我的解决方案从网站获取信息并且它成功了。就我而言,由于服务器的原因,我无法在排序时间内执行大量请求。
      猜你喜欢
      • 2016-06-18
      • 1970-01-01
      • 2015-11-26
      • 2013-08-28
      • 1970-01-01
      • 2011-04-19
      • 2017-11-10
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多