5

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

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

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

另外:警告信息:

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

或者这个:

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

另外:警告信息:

在文件(文件,“rt”)中:InternetOpenUrl 失败:'操作超时'

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

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

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

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

4

3 回答 3

4

使用该RCurl软件包的解决方案:

您可以使用更改timeout选项

curlSetOpt(timeout = 200)

或通过将其传递给调用getURL

getURL(url_vect[i], timeout = 200)

使用基础 R 的解决方案:

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

于 2013-10-09T15:02:51.957 回答
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

于 2017-01-04T02:09:49.630 回答
0

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

        # 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 如何举例

于 2013-10-09T09:30:28.680 回答