我正在將條目寫入 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用于批量寫入更好?
uj5u.com熱心網友回復:
我懷疑這很慢
正確,您沒有利用BatchWriteItem允許您寫入最多 16 MB 資料(或最多 25 個創建/洗掉請求)的API。
它本質上是大量PutItem和/或DeleteItem請求(請注意,您不能通過BatchWriteItem然而更新專案)。不使用此 API 意味著您將失去 AWS 一次性結合更新操作帶來的性能和網路改進。
它是否也使用多執行緒策略?
不,它不需要特別——只需要一個批量 API 的介面。
主要的速度提升將來自 AWS 方面的批處理,而不是本地。
PynamoDB 實作是否比
concurrent.futures用于批量寫入更好?
是的,因為重要的是實際使用批量 API,而不是如何迭代資料,以獲得最大利益。
您的concurrent.futures實作將比原始代碼更快,但仍然沒有利用BatchWriteItemAPI。您正在加快呼叫 AWS 的速度,但您仍在為每個專案發送請求my_big_map.items(),而這將占用最多的時間。
無論您是使用背景關系管理器還是迭代器,PynamoDB 似乎都通過查看源代碼使用批量 API,因此您最好使用 PynamoDB 實作,該實作還將在幕后為您處理專案的分頁等。
重要的部分是您使用BatchWriteItemAPI,這將為您提供您正在尋找的速度改進。
PynamoDB 的批量寫入可以讓您做到這一點(以及 AWS 的Boto3)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382683.html
