为什么ftp目录列表这么慢?

时间:2012-07-11 12:35:16

标签: python 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', 'john.smith@gmail.com')

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")

3 个答案:

答案 0 :(得分:8)

因为FTP服务器需要很长时间才能将目录内容收集到人类可读的形式中。您可以通过直接与FTP服务器通信来确认这一点。

相反,一个文件的传输不需要服务器端准备,它只是发送文件。

答案 1 :(得分:1)

我怀疑传输的数据非常少,因此连接握手和python执行时间会导致速度结果出现偏差。

仅测量吞吐量,但代码中的完整往返时间。

答案 2 :(得分:0)

同样的问题在这里。我的一位同事在家工作,她无法获得目录列表。她等了15分钟,但仍然没有。我必须等待大约15秒来获取目录,因此我的家用计算机和服务器之间的连接工作。 服务器是Windows XP上的FileZilla v0.9.41 beta,客户端是Win7上的Total Commander v8.0。她有120Mbps的连接。在阅读了一些文章后,我更改了服务器的参数,如下所示: - 我增加了#34;内部传输缓冲区大小" (可以在编辑 - 设置 - 杂项中找到)从32768到262144以及 - "套接字缓冲区大小"从65536到262144。 - 我启用了" MODE Z" filetransfer compression(编辑 - 设置 - 文件传输压缩)。 从那以后它就像一个魅力...... 但是我读到你必须测试不同缓冲区大小的传输速度,然后你可以选择最佳的缓冲区大小值(我听说一些连接速度慢的机器不喜欢高缓冲区大小值)。 继续试试'!

干杯 thebaios