2

下面的程序给出以下输出:

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

3 回答 3

8

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

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

于 2012-07-11T12:43:40.870 回答
1

我怀疑传输的数据太少,以至于连接握手和 python 执行时间会影响速度结果。

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

于 2012-07-11T12:37:30.223 回答
0

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

干杯

于 2013-01-09T12:27:28.363 回答