您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 迭代DynamoDB表中的所有项目

5b51 2022/1/14 8:20:56 python 字数 4885 阅读 483 来源 www.jb51.cc/python

我正在尝试遍历DynamoDB表中的所有项目. (我知道这是一个效率低下的过程,但我这样做是为了构建一个索引表.)据我所知,DynamoDB的scan()函数返回1MB或提供的限制中的较小者.为了弥补这一点,我编写了一个函数来查找“LastEvaluatedKey”结果,并从LastEvaluatedKey开始重新查询以获取所有结果.不幸的是,似乎每次我的函

概述

我正在尝试遍历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

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

你没有做错任何事

答案很长

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

>容量单位==保留计算单位
>容量单位!=保留网络传输

好吧,即使这并不是严格来说确切但非常接近,尤其是涉及到扫描时.

在扫描操作期间,存在根本区别

>扫描项目:累计大小最多为1MB,如果已达到限制,可能低于该大小
>返回项目:已扫描项目中的所有匹配项目

由于容量单位是计算单位,您需要为扫描的项目付费.实际上,您需要支付扫描项目的累积大小.请注意,此大小包括所有存储和索引开销… 0.5容量/累积KB

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

根据您的结果,我猜您的项目每个需要大约10KB,您对其实际有效负载大小的评论往往会得到确认.

一个例子

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

总结

以上是编程之家为你收集整理的python – 迭代DynamoDB表中的所有项目全部内容,希望文章能够帮你解决python – 迭代DynamoDB表中的所有项目所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶