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

Dip*_*kar 2 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")
        }
Run Code Online (Sandbox Code Playgroud)

现在我一直坚持如何同时运行所有的Jobs.

感谢您的帮助

Spa*_*man 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>
Run Code Online (Sandbox Code Playgroud)

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

  • 高性能计算如何发挥作用?您需要在您的计算机和互联网另一侧的服务器之间进行高性能的网络连接.您的CPU几乎没有做任何事情,除了等待更多字节进入以太网端口,然后要求磁盘控制器保存它们.使用我建议的下载管理器或网站上的工具,或者看看是否可以付费以在DVDROM上传送数据. (3认同)

Pau*_*tra 6

一个很好的选择是使用内置包mclapplyparLapply来自内置parallel包.然后创建一个接受需要下载的文件列表的函数:

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)
Run Code Online (Sandbox Code Playgroud)

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

请注意,mclapply只适用于Linux,parLapply在Windows下也可以正常工作.