在R中从URL读取CSV文件时超时

5

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

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

Error in file(file, "rt") : cannot open the connection

In addition: Warning message:

In file(file, "rt") : cannot open: HTTP status was '0 (nil)'

或者这个:

Error in file(file, "rt") : cannot open the connection

In addition: Warning message:

In file(file, "rt") : InternetOpenUrl failed: 'The operation timed out'

我不会每次都得到相同的警告,它们之间会变化。

现在,我想避免程序在发生这种情况时停止运行,或者简单地防止此超时错误,并告诉R等待更长时间以获取数据。我已经尝试了在脚本开头使用以下设置作为可能的解决方案,但仍然会发生错误。

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

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

4

使用RCurl包的解决方案:

您可以使用以下方法更改timeout选项:

curlSetOpt(timeout = 200)

或者通过将其传递到getURL调用中

getURL(url_vect[i], timeout = 200)

一种使用基本R的解决方案:

只需使用download.file下载每个文件,然后再考虑如何操作这些文件即可。


对于第一个解决方案,我找不到curlSetOpt()函数,我猜这属于一个额外的包,我没有使用。而对于第二个解决方案,我直接使用read.csv和链接作为“文件”,这个函数没有超时选项。 - ANieder
这些函数来自于RCurl。我看了Laszlo的解决方案,以为你在使用那个包。 - Richie Cotton
2
作为良好的实践,最好将下载文件与使用文件分开。这样,如果处理过程出现错误,您就不必重新下载文件并使用带宽。有一个循环调用(仅)download.file和另一个调用read.csv - Richie Cotton
所以,我按照你的建议使用了download.file,并结合之前的选项(timeout=190),似乎可以工作了。进行了2150次循环,持续了25个小时,没有超时或任何错误。你可能需要编辑你的答案,这样我就可以接受download.file的使用作为选择的解决方案。非常感谢! - ANieder

2

我看到这是一篇较旧的文章,但它仍然出现在谷歌搜索结果列表的前面位置,因此......

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


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] 是我复制信息的其中一个网址。不幸的是,这将增加您需要等待程序完成的时间。 更新

tryCatch如何示例


那么,这样会跳过错误并继续执行下一个循环吗?没有办法在第一次避免错误吗? - ANieder
这个选项每次都会重试,如果发生错误,它会跳过它。 - alap
我认为这是一个R互联网配置问题,一定有某个选项或设置导致了这个问题...因为我已经将相同的代码翻译成Matlab,在Matlab中执行这些长查询和循环时从未出现过错误..无论如何,我感谢提供的解决方案,如果找不到最佳(避免错误)解决方案,我会使用它。 - ANieder
你是正确的,我使用了我的解决方案从网站获取信息,并且它起作用了。在我的情况下,由于服务器的原因,我无法在短时间内进行大量请求。 - alap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接