FTPLib у Python слишком медленный? - PullRequest
4 голосов
/ 07 мая 2009

Я играл с FTP-библиотекой Python и начинаю думать, что она слишком медленная по сравнению с использованием файла сценария в DOS? Я запускаю сессии, где я загружаю тысячи файлов данных (я думаю, у меня сейчас более 8 миллионов). По моим наблюдениям, процесс загрузки в Python занимает в пять-десять раз больше времени, чем при использовании команд ftp в оболочке DOS.

Поскольку я не хочу, чтобы кто-то исправлял мой код, я не включил его. Меня больше интересует понимание, верно ли мое наблюдение или мне нужно больше возиться с аргументами.

Ответы [ 7 ]

4 голосов
/ 07 мая 2009

FTPLib реализован в Python, тогда как ваш «DOS Script» на самом деле является скриптом, который вызывает скомпилированную команду. Выполнение этой команды, вероятно, быстрее, чем интерпретация кода Python. Если это слишком медленно для вас, я предлагаю вызвать команду DOS из Python, используя модуль подпроцесса .

2 голосов
/ 11 октября 2014

определяет размер блока вместе со стандартным соединением ftp, поэтому вы получите в 1.5-3.0 раза более быстрое соединение, чем FTP Filezilla:)

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"
2 голосов
/ 07 мая 2009

Возможно, проблема в скорости в вашем коде. FTPlib не в 10 раз медленнее.

2 голосов
/ 07 мая 2009

FTPlib может быть не самым чистым Python API, я не думаю, что он настолько плох, что он работает в десять раз медленнее, чем сценарий оболочки DOS.

Если вы не предоставите код для сравнения, например, вы используете оболочку и фрагмент кода Python для пакетной обработки файлов dl 5000, я не понимаю, чем мы можем вам помочь.

1 голос
/ 12 ноября 2015

Большой размер блока не всегда оптимален. Например, загрузка одного и того же файла размером 167 МБ по проводной сети на тот же 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.

1 голос
/ 21 мая 2014

отключить ftplib и выполнить ftp через Msdos

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
1 голос
/ 09 февраля 2011
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 раз. Но все мои попытки сохранения файла превышают 160 с на ноутбуке с ядром 1,8 ГГц, ядром i7 и 8 ГБ оперативной памяти (должно быть излишним) под управлением Windows 7. Нативный клиент делает это на 100 с. Без сохранения файла мне чуть меньше 70 лет.

Я пришел к этому вопросу, потому что видел низкую производительность с ftplib на Mac (я перезапущу этот тест снова, как только у меня снова будет доступ к этой машине). Хотя асинхронизация с записями может быть хорошей идеей в этом случае, в реальной сети, я подозреваю, это принесет гораздо меньше выгоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...