在R中并行下载多个文件

在R中并行下载多个文件,r,file,download,R,File,Download,我正在尝试从ftp服务器下载460000个文件(我从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

我正在尝试从ftp服务器下载460000个文件(我从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")
        }

my.list一个好的选择是使用内置
parallel
包中的
mclappy
parlappy
。然后创建一个函数,该函数接受需要下载的文件列表:

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)
我认为,首先将大文件列表拆分为一组子列表是明智的,因为对于馈送到
mclappy
的列表中的每个条目,都会产生一个进程。如果这个列表很大,并且列表中每个项目的处理时间很短,那么并行化的开销可能会使下载速度变慢,而不是变快


请注意,
mclappy
仅在Linux上工作,
parlappy
在Windows下也可以正常工作。

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

下载多个文件也会增加磁盘负载,因为现在你的电脑正试图保存大量文件

这是另一个解决方案

使用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指定同时下载的次数、重试失败的次数等等。

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

例如:

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)

}

id请查看StackOverflow上的帖子“[运行多个R脚本/会话]”()。基本上,如果您希望加快从ftp服务器下载文件的过程,那么并发下载文件可能不会比逐个下载快多少。你总是可以在你的R应用程序中打开第二个控制台窗口。这是来自同一个源的TRMM的东西吗?它有一些关于下载的便利提示:包括下载管理器和自定义工具?只需为此编写一个python脚本。嗨,我可以访问高性能计算,所以我认为下载不会像下载一样影响太大磁盘的空间。我不介意将它们并行化,高性能计算将如何发挥作用?您的计算机与internet另一端的服务器之间需要高性能网络。您的CPU除了等待更多的字节进入以太网端口,然后要求磁盘控制器保存它们之外,几乎什么都不做。按照我的建议使用下载管理器或网站上的工具,或者看看你是否可以付费将数据发送到DVD ROM。嗨,我尝试过你的方法,但由于某些原因它不起作用。我无法解释为什么?嗯,download.file必须有文件名和目的地的参数,所以我修复了这个问题,对于windows中的Parlappy(我正在使用windows),需要定义集群(cl)。。所以我修改如下