我试图从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.
感谢您的帮助
不要这样做.真.别.它不会更快,因为限制因素将是网络速度.你最终会得到大量更慢的下载,然后服务器就会放弃并抛弃你,你最终会得到大量半下载的文件.
下载多个文件也会增加磁盘负载,因为现在您的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指定同时下载的次数,重试失败次数等等.
一个很好的选择是使用内置包mclapply或parLapply来自内置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下也可以正常工作.
| 归档时间: |
|
| 查看次数: |
2720 次 |
| 最近记录: |