【问题标题】:Downloading multiple file as parallel in R在R中并行下载多个文件
【发布时间】:2013-05-28 03:46:13
【问题描述】:

我正在尝试从 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")
        }

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

感谢您的帮助

【问题讨论】:

  • 请参阅 StackOverflow 上的帖子“[运行多个 R 脚本/会话]”(stackoverflow.com/questions/7367026/…)。基本上,如果您正在考虑加快从 ftp 服务器下载文件的过程,那么同时下载它们可能不会比逐个下载快多少。您可以随时在 R 应用程序中打开第二个控制台窗口。
  • 这个 TRMM 内容是否来自同一来源,提供一些方便的下载提示:mirador.gsfc.nasa.gov/cgi-bin/mirador/…,其中包括下载管理器和自定义工具?
  • 只需为此编写一个python脚本。

标签: r file download


【解决方案1】:

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

下载多个文件也会增加磁盘负载,因为现在您的 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 指定同时下载的次数、重试失败的次数等等。

【讨论】:

  • 嗨,我可以使用高性能计算,所以我认为下载不会像磁盘空间那样影响那么大。我不介意将它们平行放置
  • 高性能计算将如何提供帮助?您需要在您的机器和互联网另一端的服务器之间建立高性能网络。您的 CPU 几乎没有做任何事情,只是等待更多字节进入以太网端口,然后请求磁盘控制器保存它们。使用我建议的下载管理器或网站上的工具,或者看看您是否可以付费以将数据传输到 DVDROM 上。
【解决方案2】:

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

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 下也应该可以正常工作。

【讨论】:

  • 您好我已经尝试过您的方法,但由于某种原因它不起作用。我无法解释为什么?那么download.file必须有文件名和目标的参数所以我修复了这个问题并且对于windows中的parLapply(我正在使用windows)需要定义集群(cl)..所以我修改如下
【解决方案3】:

首先创建一个查找所有目标文件的 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)

}

【讨论】:

    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多