5

例如(使用 Boto):

import boto

db = boto.connect_dynamodb()

table = db.get_table('MyTable')
res = table.scan(attributes_to_get=['id'], max_results=10)

for i in res:
    print i

如果我的表中有 1,000 个对象,它会扫描所有对象,还是在 10 个之后停止?如果这确实读取了所有 1,000 个对象,我怎样才能让它只读取前 10 个?

4

2 回答 2

3

根据有关容量单位计算的文档,每个请求最多只能分析 1MB 的数据。

在扫描操作的情况下,它不是扫描返回的项目的大小,而是 Amazon DynamoDB 评估的项目的大小。也就是说,对于扫描请求,Amazon DynamoDB 最多评估 1 MB 的项目并仅返回满足扫描条件的项目。

对于仅包含 1,000 个项目的表,理论上它每次都会解析所有表。希望“限制”参数(最大值为 100)允许更早地停止该过程,以便limit返回最多的项目。

如果您的请求不涉及任何条件,则扫描的项目计数将是结果的数量。否则,它可能会大得多,但扫描项目的累积大小不能超过 1MB 的边界。

对于扫描操作,亚马逊会认为您已消耗

consumed_capacity = math.ceil(sum(parsed_data_size)/1KB)

但是请不要相信我的话:

import boto
db = boto.connect_dynamodb()

# Notice the "layer1" operation
res = db.layer1.scan('MyTable', attributes_to_get=['id'], limit=10)

print res['ScannedCount']
于 2012-08-29T18:11:17.703 回答
1

要完全回答您的问题,您还需要知道:以 Kb 为单位的项目大小是多少,表的预置读取容量是多少。

如果您只扫描代表主索引键的项目(在您的情况下为“id”)而没有任何过滤器表达式,您将收到前 10 个项目并且扫描将停止。

如果出现以下情况,它将不会检索前 10 个项目:

  1. 项目的大小加在一起大于 1MB,在这种情况下,您需要使用更多迭代并使用 ExclusiveStartKey = result['LastEvaluatedKey'] 开始第二次扫描。

或者

  1. 如果您没有足够的预置读取容量,那么您将收到“预置吞吐量不足异常”,并且需要使用“限制”来控制扫描时间。
于 2015-10-14T18:34:40.657 回答