2013-05-28 46 views
2

我試圖從ftp服務器下載460,000個文件(我從TRMM存檔數據中獲得)。我做的所有文件的列表,並把他們分開到不同的工作,但任何一個可以幫助我如何在R.同時運行這些工作正是我試圖爲例做在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") 
     } 

現在我m停留在如何在同一時間運行所有作業。

感謝您的幫助

+0

請參閱在StackOverflow上發佈「[運行多個R腳本/會話]」(http://stackoverflow.com/questions/7367026/running-multiple-r-scripts-sessions)。基本上,如果您正在加速從ftp服務器下載文件的過程,同時下載它們的速度可能不會比逐個下載它們快得多。 您可以隨時在R應用程序中打開第二個控制檯窗口。 – GregD

+0

這是TRMM的東西,從相同的來源,有一些方便的提示下載:http://mirador.gsfc.nasa.gov/cgi-bin/mirador/help.pl?helppage=checkoutoptions.shtml&helpmenuclass=help_checkout&keyword=TCC&startTime=1945 -10-08&endTime = 2013-05-28T07:20:22Z&CGISESSID = 048f56f9faf60197cd152b661964b500&SearchButton =搜索%20GES-DISC其中包括下載管理器和自定義工具? – Spacedman

+0

只需爲此寫一個python腳本。 – marbel

回答

5

一個很好的選擇是使用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) 

我認爲這是明智的做法是先被分割的文件的大名單爲一組子列表,作爲在各條目列表提供給mclapply一個過程被產生。如果這個列表很大,並且列表中的每個項目的處理時間很小,那麼並行化的開銷可能會使得下載速度變慢,而不是更快。

請注意,mclapply只適用於Linux,parLapply也應該在Windows下正常工作。

+0

嗨我已經嘗試過你的方法,但有些原因它不起作用。我無法解釋爲什麼?那麼download.file必須有文件名和目的地的參數,所以我解決了這個問題,併爲Windows中的parLapply(我使用Windows)需要定義羣集(CL)..所以我修改如下 – Dipangkar

8

不這樣做。真。別。它不會更快,因爲限制因素將成爲網絡速度。你最終會得到大量更慢的下載,然後服務器會放棄並放棄你,最終你會得到大量的半下載文件。

從現在您的電腦正在嘗試保存大量文件,下載多個文件也會增加磁盤負載。

這是另一種解決方案。

使用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同時下載多少次,重試失敗次數等。

+0

嗨我有訪問高性能計算,所以我認爲下載不會影響磁盤的空間。我不介意將它們並行處理 – Dipangkar

+3

高性能計算如何提供幫助?您的計算機與位於互聯網另一端的服務器之間需要高性能網絡連接。除了等待更多的字節進入以太網端口,然後要求磁盤控制器保存它們之外,您的CPU幾乎沒有任何操作。按照我的建議或網站上的工具使用下載管理器,或者查看是否可以付費將數據發送到DVDROM上。 – Spacedman

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,方法= 「libcurl的」,模式= 「WB」,安靜= TRUE,destfile = newDestinationFile)

}