我一直在使用Python的FTP库,并且开始认为它与在DOS中使用脚本文件相比速度太慢了?我运行会话,我下载了数千个数据文件(我想我现在有超过800万个)。我的观察是,与使用DOS shell中的ftp命令相比,Python中的下载过程似乎需要五到十倍。
由于我不希望任何人修改我的代码,所以我没有包含任何代码。我更感兴趣的是了解我的观察是否有效,或者我是否需要更多地修改这些论点。
答案 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不同。