繁体   English   中英

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

[英]Does the bulk write operation in PynamoDB utilize a multi-threading strategy?

我正在将条目写入 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 的文档中发现了这种批量写入的方法。 看起来这是一种加速写入操作的便捷方式。

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

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

我怀疑这很慢

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

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


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

不,它不需要特别 - 只需要一个与散装 API 的接口。

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


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

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

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

PynamoDB 似乎正在使用大量的 API 查看源代码,无论您使用上下文管理器还是迭代器,因此您最好使用 PynamoDB 实现,它还将在后台为您处理项目分页等。


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

PynamoDB 的批量写入将让您做到这一点(以及 AWS 的Boto3 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM