RCurl::getURL 在 运行 循环时偶尔会失败
RCurl::getURL sporadically fails when run in loop
url <- "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR105/056/SRR10503056/SRR10503056.fastq.gz"
for (i in 1:20){
RCurl::getURL(url, ftp.use.epsv = FALSE, dirlistonly = TRUE)
}
错误:
函数错误(类型、消息、asError = TRUE):
Recv 失败:连接被 peer
重置
为什么会这样?在 curl 调用之间是否需要等待计时器以避免错误?是服务器端的吗?
> sessionInfo()
R 版本 4.1.0 (2021-05-18)
平台:x86_64-pc-linux-gnu(64 位)
运行 下:Ubuntu 20.04.2 LTS
矩阵产品:默认
布拉斯:/usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
拉帕克:/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
语言环境:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=nb_NO.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=nb_NO.UTF-8
[6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=nb_NO.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nb_NO.UTF-8 LC_IDENTIFICATION=C
附加基础包:
[1] stats4 并行统计图形 grDevices utils 数据集方法 base
RCurl 版本:1.98-1.3
好的,我有一个对我来说没有失败的解决方案:
我创建了一个带有最大尝试迭代器的 try catch,默认 5 次尝试,等待时间为 1 秒,此外每个接受的 url 请求的一般等待时间为 0.05 秒。
如果有人有更安全的想法,请告诉我:
safe.url <- function(url, attempt = 1, max.attempts = 5) {
tryCatch(
expr = {
Sys.sleep(0.05)
RCurl::getURL(url, ftp.use.epsv = FALSE, dirlistonly = TRUE)
},
error = function(e){
if (attempt >= max.attempts) stop("Server is not responding to download data,
wait 30 seconds and try again!")
Sys.sleep(1)
safe.url(url, attempt = attempt + 1, max.attempts = max.attempts)
})
}
url <- "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR105/056/SRR10503056/SRR10503056.fastq.gz"
for (i in 1:100){
safe.url(url)
}
url <- "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR105/056/SRR10503056/SRR10503056.fastq.gz"
for (i in 1:20){
RCurl::getURL(url, ftp.use.epsv = FALSE, dirlistonly = TRUE)
}
错误: 函数错误(类型、消息、asError = TRUE): Recv 失败:连接被 peer
重置为什么会这样?在 curl 调用之间是否需要等待计时器以避免错误?是服务器端的吗?
> sessionInfo()
R 版本 4.1.0 (2021-05-18) 平台:x86_64-pc-linux-gnu(64 位) 运行 下:Ubuntu 20.04.2 LTS
矩阵产品:默认 布拉斯:/usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 拉帕克:/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
语言环境:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=nb_NO.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=nb_NO.UTF-8
[6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=nb_NO.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nb_NO.UTF-8 LC_IDENTIFICATION=C
附加基础包: [1] stats4 并行统计图形 grDevices utils 数据集方法 base
RCurl 版本:1.98-1.3
好的,我有一个对我来说没有失败的解决方案: 我创建了一个带有最大尝试迭代器的 try catch,默认 5 次尝试,等待时间为 1 秒,此外每个接受的 url 请求的一般等待时间为 0.05 秒。
如果有人有更安全的想法,请告诉我:
safe.url <- function(url, attempt = 1, max.attempts = 5) {
tryCatch(
expr = {
Sys.sleep(0.05)
RCurl::getURL(url, ftp.use.epsv = FALSE, dirlistonly = TRUE)
},
error = function(e){
if (attempt >= max.attempts) stop("Server is not responding to download data,
wait 30 seconds and try again!")
Sys.sleep(1)
safe.url(url, attempt = attempt + 1, max.attempts = max.attempts)
})
}
url <- "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR105/056/SRR10503056/SRR10503056.fastq.gz"
for (i in 1:100){
safe.url(url)
}