在R中以并行方式下载多个文件

时间:2013-05-28 03:46:13

标签: r file download

我正在尝试从ftp服务器下载460,000个文件(我从TRMM存档数据中获取)。我列出了所有文件并将它们分成不同的工作,但任何人都可以帮我在R中同时运行这些工作。只是我试图做的一个例子

my.list <-readLines("1998-2010.txt") # lists the ftp address of each file
job1 <- for (i in 1: 1000) { 
            download.file(my.list[i], name[i], mode = "wb")
        }
job2 <- for (i in 1001: 2000){ 
            download.file(my.list[i], name[i], mode = "wb")
        }
job3 <- for (i in 2001: 3000){ 
            download.file(my.list[i], name[i], mode = "wb")
        }

现在我仍然坚持如何同时运行所有的工作。

感谢您的帮助

3 个答案:

答案 0 :(得分:8)

不要这样做。真。别。它不会更快,因为限制因素将是网络速度。你最终会得到大量甚至更慢的下载,然后服务器就会放弃并抛弃你,你最终会得到大量半下载的文件。

下载多个文件也会增加磁盘负载,因为现在您的PC正在尝试保存大量文件。

这是另一种解决方案。

使用R(或其他工具,从列表开始的一行awk脚本)来编写一个HTML文件,如下所示:

<a href="ftp://example.com/path/file-1.dat">file-1.dat</a>
<a href="ftp://example.com/path/file-2.dat">file-2.dat</a>

等等。现在在Web浏览器中打开此文件并使用下载管理器(例如Firefox的DownThemAll)并告诉它下载所有链接。您可以使用DownThemAll指定同时下载的次数,重试失败的次数等等。

答案 1 :(得分:6)

一个不错的选择是使用内置mclapply包中的parLapplyparallel。然后创建一个接受需要下载的文件列表的函数:

library(parallel)
dowload_list = function(file_list) {
       return(lapply(download.file(file_list)))
   }
list_of_file_lists = c(my_list[1:1000], my_list[1001:2000], etc)
mclapply(list_of_file_lists, download_list)

我认为首先将大文件列表拆分为一个子列表是明智的,因为对于mclapply列表中的每个条目都会生成一个进程。如果这个列表很大,并且列表中每个项目的处理时间很短,那么并行化的开销可能会使下载速度变慢而不是更快。

请注意mclapply仅适用于Linux,parLapply也可以在Windows下正常运行。

答案 2 :(得分:0)

首先创建一个while循环,查找所有目标文件。如果当前预定义目标文件位于现有目标文件中,则脚本将创建新目标文件。这将创建许多目标文件,这些文件对应于每个下载。接下来我将脚本并行。如果我的机器上有5个核心,我将在磁盘上获得5个目标文件。我也可以使用lapply函数来做到这一点。

例如:

id <- 0
newDestinationFile <- "File.xlsx"
while(newDestinationFile %in% list.files(path =getwd(),pattern ="[.]xlsx"))
{
    newDestinationFile <- paste0("File",id,".xlsx")
    id <- id+1

download.file(url = URLS,method =“libcurl”,mode =“wb”,quiet = TRUE,destfile = newDestinationFile)

}