簡體   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