我正在将大量数据索引到DynamoDB中并尝试批量写入以增加实际吞吐量(即使索引更快)。这是一段代码(this是原始来源):
def do_batch_write(items,conn,table):
batch_list = conn.new_batch_write_list()
batch_list.add_batch(table, puts=items)
while True:
response = conn.batch_write_item(batch_list)
unprocessed = response.get('UnprocessedItems', None)
if not unprocessed:
break
# identify unprocessed items and retry batch writing
我正在使用boto版本2.8.0。如果items
包含超过25个元素,我会收到异常。 有没有办法增加此限制?另外,我注意到有时候,即使items
更短,也无法在一次尝试中处理所有这些限制。但是,这种情况发生的频率,或尝试后未处理的元素数量以及原始长度items
之间似乎没有相关性。 有没有办法避免这种情况并一次性编写所有内容?现在,最终目标是加快处理速度,而不仅仅是避免重复,因此在连续尝试之间长时间休眠不是一个选项。
THX
答案 0 :(得分:4)
“BatchWriteItem操作在一个或多个表中放入或删除多个项目。对BatchWriteItem的单个调用最多可以写入16 MB的数据,其中包含多达25个放置或删除请求。要写入的单个项目可以大到400 KB。“
某些未成功的原因可能是由于超出了表的预配置吞吐量。您是否同时在桌面上执行其他写操作?您是否尝试过增加表上的写入吞吐量以查看是否处理了更多项目。
我不知道如何增加每个请求25个项目的限制,但您可以尝试在AWS论坛上或通过您的支持渠道询问。
我认为获得最大吞吐量的最佳方法是尽可能提高写入容量单位,并将批量写入操作并行化为多个线程或进程。
答案 1 :(得分:3)
根据我的经验,尝试使用批量写入或多线程优化写入吞吐量几乎没有什么好处。批量写入节省了一点网络时间,多线程保存几乎没有,因为项目大小限制非常低,瓶颈通常是DDB限制您的请求。
所以(喜欢或不喜欢)增加DynamoDB中的写入容量是可行的方法。
啊,就像garnaat所说的那样,该地区内的延迟通常与来自区域间或外部的AWS非常不同(例如从15ms到250ms)。
答案 2 :(得分:1)
不仅增加写入容量还会使其更快。
如果您的HASH KEY分集很差,那么即使您将增加写入容量,也会出现吞吐量错误。
吞吐量错误取决于您的命中图。
示例:如果您的哈希键是1-10之间的数字,并且您有10条哈希值为1-10但记录值为10的10k记录,则即使在增加写入容量时也会出现许多吞吐量错误。 / p>