2

我正在尝试从 ftp 服务器(我从 TRMM 存档数据中获得)下载 460,000 个文件。我列出了所有文件并将它们分成不同的作业,但是任何人都可以帮助我如何在 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")
        }

现在我被困在如何同时运行所有的作业上。

感谢你的帮助

4

3 回答 3

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>

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

于 2013-05-28T07:07:03.850 回答
6

一个不错的选择是使用内置包中的mclapplyor 。然后,您创建一个接受需要下载的文件列表的函数: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 下也应该可以正常工作。

于 2013-05-28T05:25:14.430 回答
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)

}
于 2017-11-24T13:50:12.727 回答