#python-3.x #performance #boto3 #aws-cli #botocore
Вопрос:
Я пытаюсь загрузить значительное количество небольших файлов из AWS S3 (50 000 ) и постоянно отмечаю, что команда AWS sync
CLI доминирует в моем решении, написанном в boto3. Я начал просматривать исходный код интерфейса командной строки AWS в поисках способов улучшения моего решения boto, но помимо репликации TransferManager и TransferConfig я не вижу точной причины такого повышения производительности
Например, команда синхронизации:
aws s3 sync s3://my-bucket/folder/subfolder folder/subfolder
Для 50 000 небольших файлов требуется около 111 секунд. На самом деле, это даже после того, как я завернул sync
в subprocess
пробежку. И мой аналогичный код на python занимает почти вдвое больше времени (210 секунд).:
import boto3
import botocore
from s3transfer.manager import TransferManager
from s3transfer.manager import TransferConfig
# can get list of files anyhow, list_objects_v2, etc
files = []
botocore_config = botocore.config.Config(max_pool_connections=10)
s3_client = boto3.client('s3', config=botocore_config)
transfer_config = TransferConfig(
max_request_concurrency=10,
max_request_queue_size = 1000,
multipart_threshold = 8 * (1024 ** 2),
multipart_chunksize = 8 * (1024 ** 2),
max_bandwidth = None
)
transfer_config.max_in_memory_upload_chunks = 6
transfer_config.max_in_memory_download_chunks = 6
s3t = TransferManager(s3client, transfer_config)
start = time.time()
for file in files:
s3t.download(bucket=bucket, key=file, fileobj=file, subscribers=None)
s3t.shutdown()
end = time.time()
benchmark = end - start
print(f's3transfer {benchmark}')
Мой вопрос в том, чего мне не хватает, чтобы сделать эту загрузку более эффективной? Я вижу, что интерфейс командной строки AWS может загружать файлы намного быстрее, несмотря на то, что он использует один и тот же низкоуровневый модуль botocore для выполнения своих запросов.
Комментарии:
1. Всегда ли папка назначения в синхронизации пуста? в противном случае вы не загружаете все 50 тысяч файлов, а просто проверяете наличие дельт. Кроме того, что произойдет, если вы просто используете s3 = boto3.client («s3») s3.download_file («ИМЯ КОРЗИНЫ», «ИМЯ ОБЪЕКТА», «ИМЯ ФАЙЛА») и вообще пропустите s3transfer. Я не использовал s3transfer, но использовал мультипроцессор для ускорения загрузки многих небольших файлов. Может быть, просто больше накладных расходов при использовании s3transfer???
2. что такое
TransferManager
?3. Я обязательно очищаю папку назначения перед запуском. Интерфейс командной строки AWS использует s3transfer для фактического выполнения
sync
команд, и другие примеры загрузки boto3, которые я видел, указывают на то, что сеансы boto3 не являются потокобезопасными, но клиентские. Кроме того,TransferManager
является ли класс, объявленный boto3 (и версия также объявлена как часть s3transfer), предположительно, для увеличения пропускной способности