2012-07-11 245 views
2

下面的程序提供了以下的輸出:爲什麼ftp目錄列表很慢?

Listing directory ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SeriesMatrix 
1.1 Mbyte 
229.0 s 
38 Kbit/s 

Downloading file ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SeriesMatrix/GSE30/GSE30_series_matrix.txt.gz 
2.3 Mbyte 
3.1 s 
6221 Kbit/s 

爲什麼目錄列表這麼慢與文件下載相比? 有什麼方法可以加快目錄列表?

下面是代碼

from __future__ import division 
import ftplib 
import time 

server = 'ftp.ncbi.nih.gov' 
dirPath = '/pub/geo/DATA/SeriesMatrix' 
filePath = '/pub/geo/DATA/SeriesMatrix/GSE30/GSE30_series_matrix.txt.gz' 

ftp = ftplib.FTP(server) 
ftp.login('anonymous', '[email protected]') 

print 'Listing directory ftp://' + server + dirPath 
fileNames = [] 
t = time.clock() 
ftp.retrlines('NLST ' + dirPath, fileNames.append) 
t = time.clock() - t 
size = sum([len(fileName) + 1 for fileName in fileNames]) 
print '{0:.1f} Mbyte\n{1:.1f} s\n{2:.0f} Kbit/s'.format(size/2**20, t, 8 * size/2**10/t) 

print '\nDownloading file ftp://' + server + filePath 
blocks = [] 
t = time.clock() 
ftp.retrbinary('RETR ' + filePath, blocks.append) 
t = time.clock() - t 
size = sum([len(block) for block in blocks]) 
print '{0:.1f} Mbyte\n{1:.1f} s\n{2:.0f} Kbit/s'.format(size/2**20, t, 8 * size/2**10/t) 

print 
raw_input("Press Return to continue") 

回答

6

因爲FTP服務器需要很長的時間來目錄的內容收集起來到人類可讀的形式。您可以通過手動直接與FTP服務器交談來確認。

反之,一個文件的傳輸不需要服務器側準備的,它只是將文件發送。

+4

相反?今天學到了一個新詞。喜歡。 – 2012-07-11 12:46:04

+0

我也是。 ;)(給予好評) – inVader 2012-07-11 12:47:33

+3

「‘反之,’續兩件事物,「如果是這樣,它可能;而如果是這樣,這將是,但因爲它不是,它是不是這就是邏輯。」 - 來自劉易斯卡羅爾的「透過鏡子」。 – user763305 2012-07-11 12:57:09

1

我懷疑有轉移該速度結果由連接握手和python執行時間扭曲這麼少的數據。

你是不是只是測量吞吐量,但代碼中的完整往返時間。

+0

這並不完全解釋爲什麼需要近4分鐘下載目錄列表。 – user763305 2012-07-11 12:43:44

+0

夠公平的;沒有太注意數字,僅僅是測量方法。但@msw是正確的;超過1 MB的目錄列表可能需要一些時間才能構建。 – 2012-07-11 12:50:29

+0

我不關心吞吐量,我關心用戶體驗。等待4分鐘目錄列表並不是一個好的用戶體驗。 – user763305 2012-07-11 12:53:09

0

同樣的問題在這裏。我的一位同事在家工作,她無法獲得目錄列表。她等了15分鐘,什麼也沒有。我必須等待大約15秒才能獲得目錄,因此我的家用計算機和服務器之間的連接起作用。 服務器是Windows XP上的FileZilla v0.9.41測試版,客戶端是Win7上的Total Commander v8.0。她有一個120Mbps的連接。讀了一些文章後,我改變了服務器的參數如下: - 從32768到262144,也 我增加了「內部傳輸緩衝區大小」(雜項可以在編輯中找到 - - 設置) - 「套接字緩衝區大小」,從65536到262144 。 - 我啓用了「MODE Z」文件傳輸壓縮(編輯 - 設置 - 文件傳輸壓縮)。 從那時起,它就像一個魅力... 但是我讀了你在不同的緩衝區大小來測試傳輸速度之後,你可以選擇最佳的緩衝區大小值(我聽到一些機器連接速度慢不喜歡高緩衝區大小值)。 保持試着!

乾杯 thebaios