Как скачать большой ZIP (4 ГБ>) через aiofiles, aiohttpPython

Программы на Python
Ответить
Anonymous
 Как скачать большой ZIP (4 ГБ>) через aiofiles, aiohttp

Сообщение Anonymous »

Что происходит? Большую часть времени я получаю ошибку тайм-аута. Иногда появляется сообщение «Полезная нагрузка ответа не завершена». Если бы я загрузил это через кнопку сайта, это заняло бы около часа (без проблем). Я хотел бы сделать это с помощью кода, потому что существует множество разных файлов, загрузка которых занимает не менее часа, а разархивирование - еще час.
Я впервые пытаюсь выполнить асинхронную загрузку, и я не совсем уверен. Я установил тайм-аут на 2 часа, и он использует целых два часа и загружает только 70% zip-файла. (ДАЖЕ НА ЭТО ЗАХВАТЫВАЕТ ВДВОЙНОЕ ВРЕМЯ, ЧТОБЫ ПРОСТО ОТКЛЮЧИТЬ ССЫЛКУ В БРАУЗЕРЕ!!)
Я читал в другом сообщении, что увеличение лимита TCPConnector может помочь, но время ожидания все равно истекает.
Обновление: Я закомментировал строки журнала, так как не хотел воспроизводить, как его настроить, поскольку это не имеет значения.
import logger
import asyncio
import aiohttp
import aiofiles
import time

async def retrieve_data(base_link, payload, filename):
# connector=aiohttp.TCPConnector(limit=200)
async with aiohttp.ClientSession() as session:
try:
chunksize = 8*1024*1024 ## 8 MB
# , timeout=10800
async with session.get(base_link, params=payload, timeout=7200) as response:
file_size = int(response.headers['Content-Length'])
async with aiofiles.open(filename, 'wb') as fd:
progress = 0
async for chunk in response.content.iter_chunked(chunksize):
await asyncio.sleep(0)
await fd.write(chunk)
progress += len(chunk)
percentage = (progress / file_size) * 100
# logger.info(f"Download Progress: {percentage:.2f}%")
# logger.info(f"{time.strftime('%X')} - Downloaded file: ")
return filename
except asyncio.TimeoutError:
# logger.info(f"{time.strftime('%X')} - Error: asyncio.TimeoutError")
return ""
except Exception as e:
# logger.info(f"{time.strftime('%X')} - Error: {e}")
return ""

Я пробовал использовать любые функции readany() и read(), но проблемы остались те же.
while True:
chunk = await response.content.readany()
# chunk = await response.content.read(chunksize)
await asyncio.sleep(0)
if not chunk:
break


Подробнее здесь: https://stackoverflow.com/questions/798 ... es-aiohttp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»