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)
}