gpt4 book ai didi

python - 遍历 DynamoDB 表中的所有项目

转载 作者:太空狗 更新时间:2023-10-30 01:16:36 24 4
gpt4 key购买 nike

我正在尝试遍历我的 DynamoDB 表中的所有项目。 (我知道这是一个低效的过程,但我只做一次来构建索引表。)

我了解 DynamoDB 的 scan() 函数返回 1MB 或提供的限制中的较小者。为了弥补这一点,我编写了一个函数来查找“LastEvaluatedKey”结果并从 LastEvaluatedKey 开始重新查询以获得所有结果。

不幸的是,似乎每次我的函数循环时,整个数据库中的每个键都会被扫描,很快就会耗尽我分配的读取单元。它非常慢。

这是我的代码:

def search(table, scan_filter=None, range_key=None,
attributes_to_get=None,
limit=None):
""" Scan a database for values and return
a dict.
"""

start_key = None
num_results = 0
total_results = []
loop_iterations = 0
request_limit = limit

while num_results < limit:
results = self.conn.layer1.scan(table_name=table,
attributes_to_get=attributes_to_get,
exclusive_start_key=start_key,
limit=request_limit)
num_results = num_results + len(results['Items'])
start_key = results['LastEvaluatedKey']
total_results = total_results + results['Items']
loop_iterations = loop_iterations + 1
request_limit = request_limit - results['Count']

print "Count: " + str(results['Count'])
print "Scanned Count: " + str(results['ScannedCount'])
print "Last Evaluated Key: " + str(results['LastEvaluatedKey']['HashKeyElement']['S'])
print "Capacity: " + str(results['ConsumedCapacityUnits'])
print "Loop Iterations: " + str(loop_iterations)

return total_results

调用函数:

db = DB()
results = db.search(table='media',limit=500,attributes_to_get=['id'])

我的输出:

Count: 96
Scanned Count: 96
Last Evaluated Key: kBR23QJNAwYZZxF4E3N1crQuaTwjIeFfjIv8NyimI9o
Capacity: 517.5
Loop Iterations: 1
Count: 109
Scanned Count: 109
Last Evaluated Key: ATcJFKfY62NIjTYY24Z95Bd7xgeA1PLXAw3gH0KvUjY
Capacity: 516.5
Loop Iterations: 2
Count: 104
Scanned Count: 104
Last Evaluated Key: Lm3nHyW1KMXtMXNtOSpAi654DSpdwV7dnzezAxApAJg
Capacity: 516.0
Loop Iterations: 3
Count: 104
Scanned Count: 104
Last Evaluated Key: iirRBTPv9xDcqUVOAbntrmYB0PDRmn5MCDxdA6Nlpds
Capacity: 513.0
Loop Iterations: 4
Count: 100
Scanned Count: 100
Last Evaluated Key: nBUc1LHlPPELGifGuTSqPNfBxF9umymKjCCp7A7XWXY
Capacity: 516.5
Loop Iterations: 5

这是预期的行为吗?或者,我做错了什么?

最佳答案

简答

你没有做错什么

长答案

这与亚马逊计算容量单位的方式密切相关。首先,了解以下内容非常重要:

  • capacity units == reserved computational units
  • capacity units != reserved network transit

好吧,即使严格来说这并不准确,但非常接近,尤其是当涉及到 Scan 时。 .

Scan 期间操作上,有根本的区别

  • 扫描的项目:累积大小最多 1MB,如果limit 可能小于该大小已经达到了
  • 退回商品:扫描商品的所有匹配商品

作为capacity unit是一个计算单元,您支付扫描的项目。好吧,实际上,您为扫描项目的累积大小付费。请注意,此大小包括所有存储和索引开销... 0.5 capacity / cumulated KB

扫描的大小不依赖于任何过滤器,无论是字段选择器还是结果过滤器。

根据您的结果,我猜您的项目每个需要大约 10KB,您对其实际有效负载大小的评论往往会证实这一点。

另一个例子

我有一个测试表,其中只包含非常小的元素。扫描仅消耗 1.0检索 100 个项目的容量单位,因为 cumulated size < 2KB

关于python - 遍历 DynamoDB 表中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com