【问题标题】:How to speed up put_item() operations in Python Boto?如何加快 Python Boto 中的 put_item() 操作?
【发布时间】:2020-03-04 06:39:49
【问题描述】:

我正在尝试加快将存储在 AWS S3 存储桶中的 JSON 文件中包含的记录传输到 AWS DynamoDB 表的速度。 JSON 文件中的记录存储为[{'id':'123', 'name':'abc'}, {'id':'456','name':'def'}, ...] 形式的字典列表。为了执行记录传输,我在 Boto3 中使用table.batch_writer()。此代码包含在 AWS Lambda 脚本中,这样当 S3 存储桶填充新的 JSON 对象时,记录传输就会开始。我发现即使为 AWS Lambda 设置了最大超时(15 分钟),put_item() 操作也没有针对所有记录完成,平均约为 40K。 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)

【问题讨论】:

  • 您如何衡量put_item 操作存在问题?如果您为 Lambda 设置了低内存,那么 CPU 可能是一个问题(解析和序列化 JSON-s 可能不会那么快)。您也可以尝试创建多个 boto 会话并并行运行多个 batch_writers。
  • “所有记录”有多少条?

标签: python amazon-s3 aws-lambda amazon-dynamodb boto3


【解决方案1】:

我建议探索batch_put_item() 方法,该方法每批最多可以写入 16mb 的数据

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多