我有一个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公司
计算的长度实际上是字符串中的字符数。因为您使用的是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
相关问题 更多 >
编程相关推荐