DynamoDB 中的批量写入操作是不是使用多线程策略?

Posted

技术标签:

【中文标题】DynamoDB 中的批量写入操作是不是使用多线程策略?【英文标题】:Does the bulk write operation in DynamoDB utilize a multi-threading strategy?DynamoDB 中的批量写入操作是否使用多线程策略? 【发布时间】:2022-01-15 15:12:30 【问题描述】:

我正在将条目写入 DynamoDB 表:

import time
...

for item in my_big_map.items():
    Ddb_model(column1=item[0], column2=item[1], column_timestamp=time.time()).save()

我怀疑这很慢,所以我正在考虑使用诸如concurrent.futures 之类的多线程策略将每个条目写入表:

def write_one_entry(item):
    Ddb_model(column1=item[0], column2=item[1], column_timestamp=time.time()).save()

with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(write_one_entry, my_big_map.items())

但是,我在 PynamoDB 的文档中发现了这种 batch writes 的做法。看起来这是一种加速写入操作的便捷方式。

是否也使用了多线程策略?

PynamoDB 实现是否比使用concurrent.futures 进行批量写入更好?

【问题讨论】:

没有回答你的问题,但是 - 你为什么不使用 SDK? 我正在研究由前任工程师编写的既定包。我不知道为什么选择了 Pynamo。如果我切换到 SDK,这将是一个严重的重构项目……我应该切换的任何理由? 【参考方案1】:

我怀疑这很慢

正确,您没有利用 BatchWriteItem API,它允许您写入最多 16 MB 的数据(或最多 25 个创建/删除请求)。

它本质上是大量的PutItem 和/或DeleteItem 请求(请注意,您不能通过BatchWriteItem 更新项目)。不使用此 API 意味着您将失去 AWS 一次性组合更新操作所带来的性能和网络改进。


是否也使用了多线程策略?

不,它不需要特别 - 只需要一个批量 API 的接口。

主要的速度提升将来自 AWS 方面的批处理,而不是本地。


PynamoDB 实现是否比使用concurrent.futures 进行批量写入更好?

是的,因为重要的是实际使用批量 API,而不是如何迭代数据,以获得最大利益。

您的 concurrent.futures 实现将比您的原始代码更快,但仍然没有利用 BatchWriteItem API。 您正在加快调用 AWS 的速度,但您正在仍然在my_big_map.items() 中为每个项目发送请求,这将占用最多的时间。

无论您是否使用context managers or iterators,PynamoDB 似乎都在使用批量 API 查看 source code,因此您最好使用 PynamoDB 实现,该实现还将为您处理项目分页等引擎盖。


重要的是您使用了BatchWriteItem API,它将为您提供所需的速度改进。

PynamoDB 的批处理可以让你做到这一点(以及 AWS 的 Boto3)。

【讨论】:

以上是关于DynamoDB 中的批量写入操作是不是使用多线程策略?的主要内容,如果未能解决你的问题,请参考以下文章

用于DynamoDB batchWrite调用的EC2主机类型。

DynamoDB 乐观锁

使用多线程在 GNU C 中使用写入函数是不是安全

DynamoDB - JAVA - 具有低级API的BatchWrite

Springboot Java多线程操作本地文件,加读写锁,阻塞的线程等待运行中的线程执行完再查询并写入

python多线程应用挂起