繁体   English   中英

Python的FTPLib太慢了?

[英]Python's FTPLib too slow?

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

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

定义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"

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

更大的块大小并不总是最佳的。 例如,通过有线网络将相同的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不同。

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

除非你没有提供任何代码进行比较,例如你shell和python代码段批量dl 5000文件,我看不出我们如何帮助你。

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

禁用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
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的性能降低(一旦我再次访问该机器,我将再次重新运行此测试)。 虽然在这种情况下与写入异步可能是一个好主意,但在真实的网络上,我怀疑这不会是一个好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM