2014-10-01 53 views
0

我目前正試圖從超過800,000個網址下載文件。每個網址代表.txt文件。使用python快速下載文件

我使用的數據框來存儲所有

URL信息:

index  Filename           
4   .../data/1000015/0001104659-05-006777.txt 
5   .../data/1000015/0000950123-05-003812.txt 
...... 

代碼:

for i in m.index: 
    download = 'ftp:/.../' + m['Filename'][i] 
    print download 
    urllib.urlretrieve(download, '%s''%s.txt' % (m['Co_name'][i], m['Date'][i])) 

這種方法可行,但是,速度是相當低它在7分鐘內下載15個文件。考慮到我有超過800,000個文件。這是超過9個月...所以我想知道有誰能幫我改進這個嗎?非常感謝。


經過一些真正有用的評論,我做了一些改變,下面是做多處理的好方法嗎?

代碼:

def download(file): 
    import ftplib 
    ftp = ftplib.FTP('XXXX') 
    ftp.login() 
    for i in m.index: 
    a = m['Filename'][i] 
    local_file = os.path.join("local_folder", '%s %s.txt' % (m['Co_name'][i], m['Data'][i])) 
    fhandle = open(local_file,'wb') 
    print fhandle 
    ftp.retrbinary('RETR '+a, fhandle.write) 
    fhandle.close() 

m=pd.read_csv('XXXX.csv', delimiter=',', index_col='index') 

pool = Pool(10) 
pool.map(download, m) 
+1

使用多個線程 – laike9m 2014-10-01 13:24:46

+0

文件的平均大小是多少? – kums 2014-10-01 13:31:51

+0

@kums,averge是100kb – Brad 2014-10-01 13:34:05

回答

1

這樣,你建立的每個文件的新連接。這意味着每個沒有下載任何文件的用戶會損失幾秒鐘的時間。

您可以通過使用ftplib(https://docs.python.org/2/library/ftplib.html)來減少這種情況,它允許建立單個連接並通過此連接一個一個地檢索一個文件。

不過,有時候沒有數據傳輸。要使用最大帶寬,請使用線程並行下載多個文件。但請注意,有些服務器限制了並行連接的數量。

但是,時間開銷不應超過幾秒,在最壞的情況下可以說5。然後,一個100kB文件大約25s非常慢。 我想你的連接速度很慢,或者服務器是。如果FTP不是標準方式,可能是在連接終止時關閉主框架的FTP服務器,並在連接建立時啓動?然後,FTPlib應該有所幫助。 但是,半秒的開銷意味着等待400.000秒。所以,並行下載是有道理的。

可能是,您首先嚐試一個FTP客戶端,如filezilla,並檢查帶寬是否可能。

+0

非常感謝,它更快。正如你所說,我真的應該使用多個線程。 – Brad 2014-10-01 16:22:06

+0

嗨,@sweber。我更新了我的代碼。你認爲這是減少時間的有效方法嗎? – Brad 2014-10-01 17:22:39

+0

嗨!它應該工作。你爲什麼不測試它?如上所述,檢查服務器是否允許並行下載10個文件。而且,一次打開10個連接並通過這些連接下載所有文件可能會更好。這是更多的代碼,你必須檢查它是否值得。 – sweber 2014-10-03 06:51:53