Я делаю запросы на различные конечные точки API, которые содержат большие файлы MP4 (> 100 МБ) и хочу заполнить их до ведра S3. Я заключил это как задачу ввода/вывода из -за обработки запросов API + потоковую передачу видеоконтента для загрузки, поэтому я решил использовать асинхронное программирование. Моя текущая реализация кода не достаточно эффективна, когда дело доходит до загрузки на S3. Как я подошел к этому, сначала итерация над каждым куском видео, а затем загрузила все это (как показано в коде ниже), но понял, что это заняло несколько минут на видео. Затем я пробовал загрузить каждый итерационный кусок, похожий на эту реализацию, но не видел никаких улучшений. Я почти уверен, что это проблема с тем, как я обращаюсь с каждой частью видеопотока, но не нашел много решений, чтобы помочь. Я могу загрузить видео в свой локальный каталог с каждым видео, показывающим и обработка по задачам, но я заметил на S3, похоже, что видео обрабатываются по одному. Является ли AIOBOTO3 правильным решением асинхронно записать видеофайлы в S3? Это проблема с тем, как я использую aioboto3 < /code> с асинхронным программированием?
Это пример кода: < /p>
import asyncio
import httpx
from botocore.exceptions import ClientError
import aioboto3
from boto3.s3.transfer import TransferConfig
from typing import AsyncIterator
import io
async def async_upload(stream: AsyncIterator[bytes],
destination_key: str,
config: TransferConfig) -> None:
"""
Asynchronously uploads video files via `aioboto3`
Args:
stream (AsyncIterator[bytes]): The video stream broken up into iterable chunks
destination_key (str): The desired destination for the video file
config (TransferConfig): Configuration for using threading
"""
session = aioboto3.Session()
async with session.client('s3') as s3:
buffer = io.BytesIO()
async for chunk in stream:
buffer.write(chunk)
buffer.seek(0)
await s3.upload_fileobj(buffer, bucket_name, destination_key, Config=config)
async def upload_video():
# Example url
url = 'https://api.example.com/somevideo.mp4'
async with httpx.AsyncClient(timeout=httpx.Timeout(20, read=10)) as request:
# Stream to lazily load to memory for faster times
async with request.stream("GET", url) as response:
if response.status_code == 200:
try:
s3_key = f'{folder_name}/{file_name}'
config = TransferConfig(use_threads=True)
await async_upload(response.aiter_bytes(chunk_size=100*1024*1024), s3_key, config) # 100MB chunks
except ClientError as e:
print('Upload Failed', e)
else:
print('Bad Response', response.status_code)
if __name__ == '__main__':
bucket_name = 'Test-Bucket'
folder_name = 'Test'
file_name = 'Video.MP4'
asyncio.run(upload_video())
Подробнее здесь: https://stackoverflow.com/questions/796 ... -s3-python
Как оптимизировать асинхронное загрузку видео на S3 Python? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Я пытаюсь загрузить видео с помощью API, но не удалось начать загрузку видео.
Anonymous » » в форуме Python - 0 Ответы
- 79 Просмотры
-
Последнее сообщение Anonymous
-