为什么在批处理写入DynamoDB时有时会收到“item size exceeded”消息?

2024-10-01 13:39:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DynamoDB表,它的项目是长字符串。这些字符串是转换成字符串的JSON消息。在

每个JSON消息都有一个与之相关联的惟一id(eId),用作散列键。在

如果一个字符串比某个max(下面是maxlen)长,我将它分成几部分并为每个片段创建单独的项,然后创建一个引用这些片段的“父”消息。这样我就尽量避免创建超过64K限制的项目。在

我将项目收集成长度为25的批,然后批量写入表中。在

我没有使用maxlen = 30000。仍然不时地,批处理写入抛出Item size exceeds limit异常。以下是拆分代码:

mStr = json.dumps(m,encoding='utf-8', ensure_ascii=False, sort_keys=True)
lStr = len(mStr)
if lStr > maxlen:
    np = int(math.ceil(float(lStr)/maxlen))
    log.info("Splitting message with id=%s of len=%d into %d pieces of upto %d" % (eId, lStr, np, maxlen))
    start=0
    parentMessage = ""
    for ip in range(np):
       fin=(ip+1)*maxlen
       ss = mStr[start:fin]
       eId_ss = eId + ("-part%dof%d" % (ip+1, np))
       item_data = {"split" : "0", "message" : ss}
       item = createNewItem(table,eId_ss,item_data)

       csP = cPickle.dumps(item)
       szP = sys.getsizeof(csP)
       log.info("%s: [%d : %d] = %d chars, item size %d" % (eId_ss,start,fin,len(ss),szP))

       items.append(item)
       item_eIds.append(eId_ss)

       parentMessage += (eId_ss + ";")
       start=fin

       item_data = {"split" : "1", "message" : parentMessage}
       item = createNewItem(table,eId,item_data)
       items.append(item)
       item_eIds.append(eId)
else:

我注意到,行sys.getsizeof(csP)有时似乎产生的值比字符串段ss的长度大4倍左右。这种情况不常发生,但我在日志中看到了。所以我假设它会时不时地生成一个大于64K的项

当然,我可以继续降低maxlen。但由于我不知道如何产生大项目,我不知道选择什么价值。另外,较低的maxlen值意味着更多的消息被拆分,这会减慢我的代码速度。在

问题: 1为什么它有时会生成比它们“包装”的字符串大得多的项目? 2更重要的是,是否有一种可靠的方法来确保我的项目不太大而不必将maxlen降低到可笑的低值?在

泰铢

aaaa公司


Tags: 项目字符串消息datalennpitemstart
2条回答

计算的长度实际上是字符串中的字符数。因为您使用的是UTF-8,所以一个字符最多可以有4个字节长(这就是为什么您有时会看到比预期大4倍的消息)

如果您想用Python检查字节大小,可以使用:len(mStr.encode('utf-8'))

你必须重新组织数据。Dynamo DB的项目限制为64KB—这还包括属性等,因此有效大小甚至更小。在

DynamoDB-Amazon DynamoDB中的极限:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html

这说明了如何重新构造数据以在这些限制内工作(如gzip等)

使用项目指南-Amazon DynamoDB:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForItems.html

相关问题 更多 >