python-3.x 使用boto3将大量数据加载到Dynamodb非常慢

kwvwclae  于 2023-01-14  发布在  Python
关注(0)|答案(1)|浏览(175)

我试图加载超过20万条记录到我的Dynamodb表使用下面的代码从EMR 5节点集群。但它需要更多的时间和小时的时间来完全加载。我有更多的巨大的数据加载,但我想在几分钟的跨度加载它。如何实现这一点?
下面是我的代码。我只是改变了原来的列名称,我有20列插入。这里的问题是与缓慢加载。

import boto3
import json
import decimal

dynamodb = boto3.resource('dynamodb','us-west')
table = dynamodb.Table('EMP')

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='mybucket', Key='emp-rec.json')
records = json.loads(obj['Body'].read().decode('utf-8'), parse_float = decimal.Decimal)

with table.batch_writer() as batch:
     for rec in records:
         batch.put_item(Item=rec)
jvidinwx

jvidinwx1#

首先,您应该使用Amazon CloudWatch检查是否达到了表中配置的写入容量单位的限制,如果是,您可以增加容量,至少在加载期间是这样。
第二,代码创建了一条记录的批处理,这不是很有效,batch_writer()可以用来处理多条记录,例如batch_writer()文档中的示例代码:

with table.batch_writer() as batch:
    for _ in xrange(1000000):
        batch.put_item(Item={'HashKey': '...',
                             'Otherstuff': '...'})

注意for循环是如何 * 在 * batch_writer()内的吗?这样,多个记录存储在一个批处理中。但是,您的代码示例中的for * 在 * batch_writer()之外,这导致批处理大小为1。

相关问题