我一直在玩 Python 的 FTP 库,并且开始认为它与在 DOS 中使用脚本文件相比太慢了?我运行会话,下载数千个数据文件(我想我现在有超过 800 万个)。我的观察是,与在 DOS shell 中使用 ftp 命令相比,在 Python 中下载过程所需的时间似乎是它的五到十倍。
因为我不希望任何人修复我的代码,所以我没有包含任何内容。我更感兴趣的是了解我的观察是否有效,或者我是否需要对这些论点进行更多修改。
我一直在玩 Python 的 FTP 库,并且开始认为它与在 DOS 中使用脚本文件相比太慢了?我运行会话,下载数千个数据文件(我想我现在有超过 800 万个)。我的观察是,与在 DOS shell 中使用 ftp 命令相比,在 Python 中下载过程所需的时间似乎是它的五到十倍。
因为我不希望任何人修复我的代码,所以我没有包含任何内容。我更感兴趣的是了解我的观察是否有效,或者我是否需要对这些论点进行更多修改。
速度问题可能在您的代码中。FTPlib 不是慢 10 倍。
定义块大小以及 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 API,我认为它的运行速度比 DOS shell 脚本慢十倍。
除非您不提供任何代码进行比较,例如您使用 shell 和 python 片段来批处理 dl 5000 个文件,否则我看不出我们可以如何帮助您。
FTPLib 是用 Python 实现的,而您的“DOS 脚本”实际上是一个调用已编译命令的脚本。执行此命令可能比解释 Python 代码更快。如果它对你来说太慢,我建议使用subprocess 模块从 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。
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 倍。但是我在运行 Windows 7 的核心 1.8Ghz 核心 i7 和 8GB 内存(应该是矫枉过正)的笔记本电脑上运行这个保存文件的速度都在 160 秒以上。本机客户端以 100 秒的速度运行。如果没有文件保存,我还不到 70 岁。
我来这个问题是因为我看到在 mac 上使用 ftplib 的性能很慢(一旦我再次访问那台机器,我将再次重新运行这个测试)。虽然在这种情况下与写入异步可能是一个好主意,但在真实的网络上,我怀疑这会少得多。
禁用 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