2014-03-04 68 views
1

我試圖將我的Python代碼從使用dynamodbdynamodb2來訪問全局二級索引功能。對於我來說,一個概念在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和一個secondaryIdsecondaryId不是唯一的,因爲我可能會在幾乎同一時間收到幾條相同的消息。 primaryId是獨一無二的。也就是說,如果我幾乎在同一時間收到一組消息,但這很不好。但是,不時地說,在幾個小時內,我可能會收到一條消息,要求用相同的primaryId覆蓋現有消息。因此,這似乎與從dynamodb2documentation 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是好的。

對不起,長信息。

回答

0

A 批次將在請求發送時開始,並在批次中的最後一個請求完成時結束。

與任何RESTful API一樣,每個請求都帶有的費用,這意味着完成所述請求需要多少/多少資源。對於DynamoDB2中的batch_write()類,它們是包裝組中的請求並創建隊列來處理它們,這將降低成本,因爲它們不再是單獨的請求。

batch_write()類返回處理單個請求,並返回給你稍微類似於Table的目標,僅僅有put_itemdelete_item請求上下文管理。

DynamoDB的最大批量大小爲25,就像您讀過的一樣。來自source code中的評論:

DynamoDB的最大批量大小爲每個請求25個項目。如果試圖 把/刪除不止於此,上下文管理器將分批許多 ,因爲它可以達到這個數字,然後將它們刷新到DynamoDB &繼續 配料隨着越來越多的電話進來,

你還可以閱讀有關從DynamoDB遷移到DynamoDB2 here的特別批處理。

相關問題