Как ускорить операции put_item () в Python Boto? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь ускорить передачу записей, содержащихся в файле JSON, хранящемся в корзине AWS S3, в таблицу AWS DynamoDB. Записи в файле JSON хранятся в виде списка словарей в форме [{'id':'123', 'name':'abc'}, {'id':'456','name':'def'}, ...]. Для передачи записи я использую table.batch_writer() в Boto3. Этот код содержится в лямбда-скрипте AWS, так что, когда корзина S3 заполняется новым объектом JSON, начинается передача записи. Я обнаружил, что даже при максимальном тайм-ауте, установленном для AWS Lambda (15 минут), операции put_item () не завершаются для всех записей, которые в среднем составляют около 40 КБ. Операции put_item () кажутся невероятно медленными, что заставляет меня думать, что это не оптимальный способ передачи записей из S3 в DynamoDB.

Существует ли более быстрый способ передачи записей JSON из корзины S3 в таблицу DynamoDB?

import json
import boto3

s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb',region_name='us-east-2')

def lambda_handler(event, context, verbose=True):
    bucket = event['Records'][0]['s3']['bucket']['name']
    json_filename = event['Records'][0]['s3']['object']['key']
    json_object = s3_client.get_object(Bucket=bucket, Key=json_filename)
    json_file = json_object['Body'].read()
    data_dict = json.loads(json_file)
    table = dynamodb.Table('the_dynamodb_table_name')
    with table.batch_writer() as batch:
        for rec in data_dict:
            batch.put_item(Item=rec)

1 Ответ

2 голосов
/ 07 ноября 2019

Я бы предложил изучить метод batch_put_item(), который может записывать до 16 МБ данных на пакет

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.batch_write_item

...