我正在尝试将我的python代码从使用dynamodb
移动到dynamodb2
以访问全局二级索引功能。与ddb2
相比,ddb
与ddb
相比,一个概念不太明确。这是我的新代码的一个版本,它基本上是从我原来的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 = []
代码修改的:
primaryId
所以我在这里做的是从队列中获取(JSON)消息。每封邮件都有secondaryId
和secondaryId
。 primaryId
并不是唯一的,因为我可能会在同一时间收到几条消息。 primaryId
有点独特。也就是说,如果我在同一时间得到一组具有相同primaryId
的消息,那就很糟糕了。但是,有时候,我会在几个小时内收到一条消息,要求覆盖具有相同dynamodb2
的现有消息。所以这似乎与ddb
documentation page与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)
类似的陈述很好地吻合:
DynamoDB的最大批量大小为每个请求25个项目。如果您尝试放置/删除更多,则上下文管理器将批量尽可能多地批量处理该数字,然后将其刷新到DynamoDB并在更多呼叫进入时继续批处理。
然而,我注意到的是,我通过队列获得的大量消息从未进入数据库。也就是说,当我稍后尝试检索它们时,它们就不存在了。所以我被告知更好的处理批量写入的方法是做这样的事情:
batch_write()
也就是说,我只调用primaryId
一次,类似于我只打开一次文件,然后连续写入文件。但在这种情况下,我不明白“25最大规则”是什么意思。批次何时开始和结束?我如何检查重复的{{1}}?也就是说,记住我通过队列收到的所有消息是不现实的,因为(i)我有太多这些消息(系统全天候运行)和(ii)如前所述,偶尔重复的ids都可以。
抱歉这条长信息。
答案 0 :(得分:0)
批次将在发送请求时启动,并在批次中的最后一个请求完成时结束。
与任何RESTful API一样,每个请求都附带 cost ,表示完成所述请求需要多少/多少资源。使用DynamoDB2中的batch_write()
类,它们包装组中的请求并创建队列来处理它们,这将降低成本,因为它们不是更长的个人要求。
batch_write()
类返回一个处理单个请求的上下文管理器,您返回的内容略微类似于Table
个对象,但只有put_item
和delete_item
个请求。
DynamoDB的最大批量大小为25,就像你读过的那样。来自source code:
中的评论DynamoDB的最大批量大小为每个请求25个项目。如果你尝试 要放/删除更多,上下文管理器将批量多次 因为它可以达到这个数字,然后将它们刷新到DynamoDB&继续 随着更多电话的进入而进行批处理。
您还可以阅读有关从DynamoDB迁移到DynamoDB2 here的特定批次的信息。