python dynamodb扫描吞吐量错误

时间:2014-11-25 22:08:01

标签: python amazon-dynamodb database-scan

我有一个包含segment_id,beat_id,patient_id

的数据库

在dynamoDB版本2中,当我使用以下命令进行扫描时,我只能获得1个特定患者的值。当我输入其他段时,患者值我得到一个ThroughputExceededException。

table.scan(segment_id__eq='xCrKYvnfZlm6VCQ',beat_id__gt=1,patient_id__eq='3854520.edf')
  1. 为什么它只适用于1名患者,并为其他人提供了一个PassputExceededException?

1 个答案:

答案 0 :(得分:1)

您正在执行的扫描会读取DynamoDB表中的每个项目,并在满足指定条件时返回它(segment_id__eq =' xCrKYvnfZlm6VCQ',beat_id__gt = 1,patient_id__eq =' 3854520.edf' )。每次读取(即使项目不符合条件)都会消耗您提供的读取容量。如果您要查找单个记录,则最有效的方法是对DynamoDB使用GetItemBatchGetItem调用,因为您只会消耗指定项目的读取容量。如果您要检索特定范围的记录,使用Range KeyGlobalLocal Secondary Index会更高效,这样您就可以Query这些项目,因为您只会消耗符合查询条件的所有项目的读取容量。您能否提供有关表格架构的更多信息?

请参阅此developer guide详细介绍扫描与查询之间的差异。

使用查询的一个示例是,如果segment_id是散列键,则beat_id是范围键。您可以使用指定的segment_id和指定的beat_id范围查询所有记录。这将仅消耗检索这些特定记录所需的读取容量,而不是读取整个表。此外,您可以将查询filter应用于其他属性,例如patient_id,以便只返回您想要的结果。

有关扫描/查询消耗容量的更多详细信息:

查询和扫描最终都是一致的读取,因此一个读取容量单位将允许您以每秒8KB的速度读取。

如果您仍然遇到限制,可以采用以下方法来缓解异常:

  1. 延长请求之间的时间,以使您的读取速率保持在预设的读取容量之下。 SDK retries默认限制例外。
  2. 增加您的预配读取容量,以考虑项目大小和请求率。 请参阅how provisioned throughput workscalculating item sizes上的这些资源。
  3. 有关扫描定价的更多详情:

    要确定使用“扫描”或“查询”来读取表中项目所需的读取容量:

    1. 计算您正在阅读的数据量(将所有要读取的项目的大小相加)
    2. 四舍五入到最接近的4KB
    3. 除以4KB(强一致读取)或8KB(最终一致读取)以获得将消耗的容量单位数。
    4. 要确定使用GetItem或BatchGetItem读取表格中的项目需要多少读取容量:

      1. 对于每个单独的项目,将该项目的大小向上舍入到最接近的4KB
      2. 的倍数
      3. 除以4KB(强一致读取)或8kb(最终一致读取)以获得每个项目将消耗的容量单位数
      4. 添加每个项目将消耗的容量单位,以获得将消耗的容量单位总数。
      5. 作为一个例子,假设我的表中有10个项目,它们都是1KB,我计划通过最终的一致操作来检索它们。如果我使用GetItem检索它们,每个单独的项目将消耗1/2读取容量单位,因此总成本将是1/2 * 10 = 5个读取容量单位。如果我通过扫描检索它们,则所有项目的总大小为10KB,这将消耗2个读取容量单位。