DynamoDB 中的批量写入操作是否使用多线程策略?
Does the bulk write operation in DynamoDB utilize a multi-threading strategy?
我正在将条目写入 DynamoDB table:
import time
...
for item in my_big_map.items():
Ddb_model(column1=item[0], column2=item[1], column_timestamp=time.time()).save()
我怀疑这很慢,所以我正在考虑使用多线程策略,例如 concurrent.futures
将每个条目写入 table:
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
进行批量写入更好?
I suspect this is slow
正确,您没有利用 BatchWriteItem
API 允许您写入最多 16 MB 的数据(或最多 25 creation/delete 请求).
它本质上是大量的 PutItem
and/or DeleteItem
请求(请注意,您不能通过 BatchWriteItem
更新项目,但是 ).不使用此 API 意味着您将失去 AWS 一次性结合更新操作带来的性能和网络改进。
Does it also use a multi-threading strategy?
不,不需要特别注意 - 只需要一个批量接口 API。
主要的速度改进将来自 AWS 端的批处理,而不是本地。
Is the PynamoDB implementation better than using concurrent.futures
to do bulk writes?
是的,因为重要的是实际使用批量 API,而不是如何迭代数据,以获得最大利益。
您的 concurrent.futures
实施将比您的原始代码更快,但仍然没有利用 BatchWriteItem
API. 您正在加快您调用 AWS 的方式,但您仍在 my_big_map.items()
中发送每个项目的请求,这将占用最多时间。
PynamoDB 似乎正在使用大量 API 查看 source code regardless of whether you use context managers or iterators 所以你最好使用 PynamoDB 实现,它也将为你处理项目分页等引擎盖。
重要的部分是您使用 BatchWriteItem
API,这将为您提供所需的速度提升。
PynamoDB 的批量写入可以让你做到这一点(以及 AWS 的 Boto3)。
我正在将条目写入 DynamoDB table:
import time
...
for item in my_big_map.items():
Ddb_model(column1=item[0], column2=item[1], column_timestamp=time.time()).save()
我怀疑这很慢,所以我正在考虑使用多线程策略,例如 concurrent.futures
将每个条目写入 table:
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
进行批量写入更好?
I suspect this is slow
正确,您没有利用 BatchWriteItem
API 允许您写入最多 16 MB 的数据(或最多 25 creation/delete 请求).
它本质上是大量的 PutItem
and/or DeleteItem
请求(请注意,您不能通过 BatchWriteItem
更新项目,但是 ).不使用此 API 意味着您将失去 AWS 一次性结合更新操作带来的性能和网络改进。
Does it also use a multi-threading strategy?
不,不需要特别注意 - 只需要一个批量接口 API。
主要的速度改进将来自 AWS 端的批处理,而不是本地。
Is the PynamoDB implementation better than using
concurrent.futures
to do bulk writes?
是的,因为重要的是实际使用批量 API,而不是如何迭代数据,以获得最大利益。
您的 concurrent.futures
实施将比您的原始代码更快,但仍然没有利用 BatchWriteItem
API. 您正在加快您调用 AWS 的方式,但您仍在 my_big_map.items()
中发送每个项目的请求,这将占用最多时间。
PynamoDB 似乎正在使用大量 API 查看 source code regardless of whether you use context managers or iterators 所以你最好使用 PynamoDB 实现,它也将为你处理项目分页等引擎盖。
重要的部分是您使用 BatchWriteItem
API,这将为您提供所需的速度提升。
PynamoDB 的批量写入可以让你做到这一点(以及 AWS 的 Boto3)。