Python的FTPLib太慢了?

时间:2009-05-07 14:05:12

标签: python ftp performance dos

我一直在使用Python的FTP库,并且开始认为它与在DOS中使用脚本文件相比速度太慢了?我运行会话,我下载了数千个数据文件(我想我现在有超过800万个)。我的观察是,与使用DOS shell中的ftp命令相比,Python中的下载过程似乎需要五到十倍。

由于我不希望任何人修改我的代码,所以我没有包含任何代码。我更感兴趣的是了解我的观察是否有效,或者我是否需要更多地修改这些论点。

7 个答案:

答案 0 :(得分:4)

FTPLib是用Python实现的,而“DOS脚本”实际上是一个调用编译命令的脚本。执行此命令可能比解释Python代码更快。如果它对你来说太慢,我建议使用subprocess module从Python调用DOS命令。

答案 1 :(得分:2)

FTPlib可能不是最干净的Python API,我认为它运行速度比DOS shell脚本慢十倍。

除非您没有提供任何可比较的代码,例如shell和python代码段批量dl 5000文件,否则我无法看到我们如何为您提供帮助。

答案 2 :(得分:2)

速度问题可能在您的代码中。 FTPlib的速度要慢10倍。

答案 3 :(得分:2)

定义blocksize以及ftp连接的storbinary,因此你将获得比FTP Filezilla快1.5-3.0倍的连接:)

from ftplib import FTP

USER = "Your_user_id"
PASS = "Your_password"
PORT = 21
SERVER = 'ftp.billionuploads.com' #use FTP server name here

ftp = FTP()
ftp.connect(SERVER, PORT)
ftp.login(USER, PASS)

try:
    file = open(r'C:\Python27\1.jpg','rb')
    ftp.storbinary('STOR ' + '1.jpg', file,102400) #here we store file in 100kb blocksize
    ftp.quit()
    file.close()
    print "File transfered"
except:
    print "Error in File transfering"

答案 4 :(得分:1)

import ftplib
import time
ftp = ftplib.FTP("localhost", "mph")
t0 = time.time()
with open('big.gz.sav', 'wb') as f:
    ftp.retrbinary('RETR ' + '/Temp/big.gz', f.write)
t1 = time.time()
ftp.close()
ftp = ftplib.FTP("localhost", "mph")
t2 = time.time()
ftp.retrbinary('RETR ' + '/Temp/big.gz', lambda x: x)
t3 = time.time()
print "saving file: %f to %f: %f delta" % (t0, t1, t1 - t0)
print "not saving file: %f to %f: %f delta" % (t2, t3, t3 - t2)

所以,也许不是10倍。但是我的这个保存文件的运行都在160s以上的笔记本电脑上,核心1.8Ghz核心i7和8GB内存(应该是矫枉过正)运行Windows 7.本机客户端在100s时完成。没有文件保存,我只是不到70岁。

我遇到了这个问题,因为我在Mac上看到了ftplib的性能降低(一旦我再次访问该机器,我将再次重新运行此测试)。虽然在这种情况下与写入异步可能是一个好主意,但在真实的网络上,我怀疑这样做的好处远远不够。

答案 5 :(得分:1)

禁用ftplib并通过Msdos执行ftp

os.system('FTP -v -i -s:C:\\ndfd\\wgrib2\\ftpscript.txt')

在ftpscript.txt内部

open example.com
username
password
!:--- FTP commands below here ---
lcd c:\MyLocalDirectory
cd  public_html/MyRemoteDirectory
binary
mput "*.*"
disconnect
bye

答案 6 :(得分:1)

更大的块大小并不总是最佳的。 例如,通过有线网络将相同的167 MB文件上传到同一个FTP服务器,我在几秒钟内获得了各种块大小的后续时间:

Blocksize  Time
102400       40
 51200       30
 25600       28
 32768       30
 24576       31
 19200       34
 16384       61
 12800      144

在此配置中,最佳值约为32768(4x8192)。

但是,如果我使用无线技术,我会得到这些时间:

Blocksize  Time
204800       78
102400       76
 51200       79
 25600       76
 32768       89
 24576       86
 19200       75
 16384      166
 12800      178
default     223

在这种情况下,有几个最佳的块大小值,都与32768不同。