#python #ftp #timeout #ftp-client #ftplib
#python #ftp #тайм-аут #ftp-клиент #ftplib
Вопрос:
Не очень хорошо разбираюсь в FTP-серверах… Передача большого объема данных (в текстовом формате) с FTP-сервера NOAA (Национальное управление океанических и атмосферных исследований) и вставка их на SQL-сервер. Все прошло хорошо для нескольких десятков миллионов строк, пока я не добрался до самого большого файла, с которым я когда-либо сталкивался, размером ~ 2,5 МБ [только текст].
for file in ftpList:
if file.endswith(".gz") and not failedRun:
flo = io.BytesIO()
ftp.retrbinary('RETR ' file, flo.write)
flo.seek(0)
with gzip.open(flo, 'rb') as f:
for line in f:
## REPLACE FUNCTION FOR QUERY FILE ##
cursor.execute(qry_wx)
cursor.commit()
При попытке запустить этот файл большего размера, чем обычно, я получаю эту ошибку:
2021-01-02 12:07:19,558-ERROR-Error: 421 No transfer timeout (300 seconds): closing control connection
Traceback (most recent call last):
File "E:PythonProjectsISHWX_TO_DB.py", line 72, in <module>
ftp.retrbinary('RETR ' file, flo.write)
File "E:ProgramDataAnaconda3libftplib.py", line 441, in retrbinary
self.voidcmd('TYPE I')
File "E:ProgramDataAnaconda3libftplib.py", line 278, in voidcmd
return self.voidresp()
File "E:ProgramDataAnaconda3libftplib.py", line 251, in voidresp
resp = self.getresp()
File "E:ProgramDataAnaconda3libftplib.py", line 244, in getresp
raise error_temp(resp)
ftplib.error_temp: 421 No transfer timeout (300 seconds): closing control connection
Я попытался изменить параметр timeout при первоначальном вызове класса FTP на> 300 секунд, но с тех пор узнал, что это время ожидания без передачи является значением по умолчанию для FTP-сервера, и я не могу его изменить.
Я хотел бы лучше объяснить проблему, но, как я уже сказал, я довольно новичок в этом и не до конца понимаю метод retrbinary. Есть какие-нибудь предложения здесь?
Ответ №1:
Сервер имеет ограничение на то, как долго вы не можете передавать какие-либо файлы, прежде чем сервер разорвет соединение.
В качестве обходного пути сначала загрузите все файлы. И только затем обрабатывайте их.