Скажем, если загрузка не удалась на 10 МБ, а код поддержки активности в вашем вопросе набрал 512 МБ, но этого было недостаточно для 3 ГБ - вы можете объединить их. Используйте keepalive для чтения 512 МБ за один раз, затем прервите или переподключите и прочитайте следующие 512 МБ, пока не закончите.
ался решить проблему, когда мы загружаем файл с ftp / ftps. Файл успешно загружен, но после завершения загрузки файла операции не выполняются. Не произошло ошибок, которые могли бы дать больше информации о проблеме. Я попытался найти это в stackoverflow и нашел этоссылка который говорит о подобной постановке проблемы и выглядит так, как будто я столкнулся с подобной проблемой, хотя я не уверен. Нужна немного больше помощи в решении проблемы.
Я попытался установить тайм-аут соединения FTP на 60 минут, но с меньшей помощью. До этого я использовал retrbinary () из ftplib, но там возникает та же проблема. Я попытался передать разные размеры блоков и окон, но с этим также проблема была воспроизводимой.
Я пытаюсь загрузить файл размером ~ 3 ГБ из кластера AWS EMR. Пример кода написан ниже.
def download_ftp(self, ip, port, user_name, password, file_name, target_path):
try:
os.chdir(target_path)
ftp = FTP(host=ip)
ftp.connect(port=int(port), timeout=3000)
ftp.login(user=user_name, passwd=password)
if ftp.nlst(file_name) != []:
dir = os.path.split(file_name)
ftp.cwd(dir[0])
for filename in ftp.nlst(file_name):
sock = ftp.transfercmd('RETR ' + filename)
def background():
fhandle = open(filename, 'wb')
while True:
block = sock.recv(1024 * 1024)
if not block:
break
fhandle.write(block)
sock.close()
t = threading.Thread(target=background)
t.start()
while t.is_alive():
t.join(60)
ftp.voidcmd('NOOP')
logger.info("File " + filename + " fetched successfully")
return True
else:
logger.error("File " + file_name + " is not present in FTP")
except Exception, e:
logger.error(e)
raise
Другой вариант, предложенный в вышеупомянутой ссылке, - закрыть соединение после загрузки небольшого фрагмента файла и затем перезапустить соединение. Может кто-нибудь подсказать, как этого можно добиться, не уверенный, как возобновить загрузку с той же точки, где загрузка файла была остановлена в последний раз перед закрытием соединения. Будет ли этот метод полным доказательством загрузки всего файла.
Я не очень разбираюсь в настройках тайм-аута на уровне FTP-сервера, поэтому не знал, что и как нужно изменить. Я в основном хочу написать общий загрузчик FTP, который может помочь в загрузке файлов с FTP / FTPS.
Когда я использую метод retrbinary () в ftplib и устанавливаю уровень отладки 2.
ftp.set_debuglevel(2)
ftp.retrbinary('RETR ' + filename, fhandle.write)
Ниже журналы печатаются.
CMD «ТИП I»ставить 'ТИП I \ r \ n'получить '200 Тип установлен в I. \ r \ n'соответственно '200 Тип установлен на I.'CMD 'PASV'ставить 'PASV \ г \ п'получить '227 Вход в пассивный режим (64,27,160,28,133,251). \ R \ n'соответственно '227 Вход в пассивный режим (64,27,160,28,133,251).'CMD 'RETR FFFT_BRA_PM_R_201711.txt'ставить 'RETR FFFT_BRA_PM_R_201711.txt \ r \ n'получить '150 Открытие соединения для передачи данных в двоичном режиме для FFFT_BRA_PM_R_201711.txt. \ R \ n'соответственно '150 Открытие соединения для передачи данных в режиме BINARY для FFFT_BRA_PM_R_201711.txt.'