4

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

因为我不希望任何人修复我的代码,所以我没有包含任何内容。我更感兴趣的是了解我的观察是否有效,或者我是否需要对这些论点进行更多修改。

4

7 回答 7

4

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

于 2009-05-07T15:51:09.933 回答
4

定义块大小以及 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"
于 2014-10-11T11:23:22.000 回答
3

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

除非您不提供任何代码进行比较,例如您使用 shell 和 python 片段来批处理 dl 5000 个文件,否则我看不出我们可以如何帮助您。

于 2009-05-07T14:20:38.137 回答
3

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

于 2009-05-07T14:35:34.950 回答
3

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

于 2015-11-12T09:25:07.767 回答
2
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 的性能很慢(一旦我再次访问那台机器,我将再次重新运行这个测试)。虽然在这种情况下与写入异步可能是一个好主意,但在真实的网络上,我怀疑这会少得多。

于 2011-02-09T05:22:27.670 回答
2

禁用 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
于 2014-05-21T08:09:38.730 回答