我試圖將我的Python代碼從使用dynamodb
到dynamodb2
來訪問全局二級索引功能。對於我來說,一個概念在ddb2
中比ddb
要少得多,這是一個批次。這裏是曾經的我的新代碼版本這是基本上是從我原來的ddb
代碼修改:dynamodb2批次的開始和結束位置在哪裏?
item_pIds = []
batch = table.batch_write()
count = 0
while True:
m = inq.read()
count = count + 1
mStr = json.dumps(m)
pid = m['primaryId']
if pid in item_pIds:
print "pid=%d already exists in the batch, ignoring" % pid
continue
item_pIds.append(pid)
sid = m['secondaryId']
item_data = {"primaryId" : pid, "secondaryId"] : sid, "message"] : mStr}
batch.put_item(data=item_data)
if count >= 25:
batch = table.batch_write()
count = 0
item_pIds = []
所以我在做什麼這裏是我得到從隊列(JSON)消息。每封郵件有一個primaryId
和一個secondaryId
。 secondaryId
不是唯一的,因爲我可能會在幾乎同一時間收到幾條相同的消息。 primaryId
是獨一無二的。也就是說,如果我幾乎在同一時間收到一組消息,但這很不好。但是,不時地說,在幾個小時內,我可能會收到一條消息,要求用相同的primaryId
覆蓋現有消息。因此,這似乎與從dynamodb2
documentation page類似的ddb
的聲明相吻合:
DynamoDB的最大批量大小爲每個請求的25個項目。如果你試圖把/刪除不止於此,上下文管理器將批量儘可能多的,因爲它可以達到這個數字,然後將它們刷新到DynamoDB和繼續配料隨着越來越多的電話進來,
然而,我注意到的是,我通過隊列獲得的大量消息從未將其傳送到數據庫。也就是說,當我嘗試稍後檢索它們時,它們不在那裏。所以,我被告知,處理一批更好的方式寫在做這樣的事情:
with table.batch_write() as batch:
while True:
m = inq.read()
mStr = json.dumps(m)
pid = m['primaryId']
sid = m['secondaryId']
item_data = {"primaryId" : pid, "secondaryId"] : sid, "message"] : mStr}
batch.put_item(data=item_data)
也就是說,我只叫batch_write()
一次類似我怎麼會打開一個文件只有一次,然後寫進去不斷。但在這種情況下,我不明白「25 max」的規則是什麼意思。批次何時開始和結束?我該如何檢查重複的primaryId
?也就是說,記住全部我通過隊列收到的消息是不現實的,因爲(i)我有太多的消息(系統24/7運行)和(ii)正如我之前所說的,偶爾重複的id是好的。
對不起,長信息。