Понятное и концептуальное руководство для начинающих
Корзины S3 на Amazon — это места хранения, где вы можете хранить текстовые файлы, аудиофайлы, видеофайлы, изображения и любые другие материалы, которые вам нравятся.
S3 имеет API-интерфейсы, которые можно вызывать для выполнения всех действий, которые можно выполнить с базой данных.
1. Создание ресурса для подключения к S3
Есть два способа подключения к S3.
- Клиент: старая версия с более подробным кодом по сравнению с ресурсом.
- Ресурс: более новая версия клиента, которая предоставляет больше методов для обработки операций и менее подробных методов кодирования.
Мы придерживаемся использования ресурса для подключения здесь. Я разрабатываю функции для каждой задачи, поэтому в итоге мы соберем их все в класс. Таким образом, мы можем увеличить его повторное использование.
Вам необходимо иметь три учетных данных, упомянутых в коде. Если вы хотите создать учетную запись S3, следуйте этому учебнику.
Я буду использовать здесь уже созданную корзину в S3. Имя моего сегмента хранится в bucket_name
, которое я получил из учетной записи S3. Существуют ресурсные методы для создания сегментов из Python, но для простоты я буду использовать существующий сегмент.
2. Выгрузка данных в корзину с автоматическим многокомпонентным
Если файл большой, например 1 ГБ, корзины S3 позволяют параллельным потокам одновременно загружать фрагменты файла, чтобы сократить время загрузки. Если объем данных меньше 1 ГБ, загрузку будет выполнять один поток.
Переключение между несколькими потоками и одним потоком происходит автоматически. Пороговое значение данных должно быть установлено, как указано выше, например, я использовал 1 ГБ.
Пороговое значение будет установлено вами, следовательно, вы будете корректировать его в соответствии с задачей.
Обязательные параметры:
bucket_name (String)
: имя корзины в S3data (byte string)
: объект строки байтов.
Обратите внимание на название метода загрузки, его upload_fileobj(). Этот метод используется для загрузки объектов бинарного типа. Это означает, что если файл находится в вашей локальной системе, он не будет в двоичной форме. Вы должны использовать:
with open('filename', 'rb') as data: s3.upload_fileobj(data, 'mybucket', 'mykey')
filename
— это путь к файлу в системе. rb
означает чтение и запись в двоичном формате.
Если данные извлекаются из внешнего URL-адреса, то они уже в двоичном виде, поэтому метод будет работать без каких-либо дополнительных изменений.
Если вы хотите узнать больше о том, как данные перемещаются по сети, и о разнице между строками байтов и простыми строками, прочтите мою статью в разделе ресурсов.
3. file_name (String)
: Любое имя файла. Это будет имя файла в корзине S3 и идентификатор файла. Поэтому напишите осмысленное имя.
Второстепенные параметры:
4. file_size (String/int)
: Размер файла, который мы хотим загрузить. В функции ProgressPercentage(file_name,file_size)
тип изменяется на число с плавающей запятой, поэтому работают как строковые, так и целые числа.
5. content_type (String)
:тип данных; .pdf, .mp4 и т. д.
TransferConfig
— это файл конфигурации, в котором:
multipart_threshold
: предел, выше которого активируется многопоточность.max_concurrency
: количество потоков. 10 по умолчанию.multipart_chunksize
: размер данных в каждом потоке.use_threads
: включение потоков.
3. Просмотр содержимого сегментов
У каждого объекта в корзине есть атрибуты, которые мы можем использовать. obj.key
показывает нам file_name
данных, которые мы загрузили. Другие полезные атрибуты можно увидеть в официальной документации S3, ссылки приведены внизу этого руководства.
4. Последний класс с более полезными методами
Progress Percentage — это внутренний класс, предоставляемый boto3 S3. Это очень полезно при загрузке больших файлов, поскольку показывает ход загрузки. Следовательно, мы можем видеть индикатор выполнения с цифрами вместо пустого экрана.
Я изменил этот класс так, чтобы он принимал file_size
в качестве входных данных, а не вычислял из самой библиотеки os. Поскольку я работал с внешним URL-адресом, мне пришлось самому указать размер файла.
Вы можете использовать класс и создавать объекты, как вам нравится, и играть с ведрами.
Вы также можете создать более одного сегмента с одним подключением, используя этот класс. Кроме того, вам не нужно закрывать соединение после загрузки/скачивания, потому что это соединение HTTP 1.1, которое автоматически закрывается через некоторое время самим boto3.