【问题标题】:Python: getting the first 100 most recent keys in amazon s3 bucketPython:获取亚马逊 s3 存储桶中的前 100 个最新密钥
【发布时间】:2018-08-14 14:29:28
【问题描述】:

我尝试使用 boto,但它有 .list() 方法,这对我的数据集来说需要很长时间,而 .get_all_keys() 则让它随机化。我想在我的 S3 存储桶中获取大约 100-1000 个最新密钥,其中包含数百万个密钥。最有效的方法是什么。

【问题讨论】:

  • 根据 LastModified 排序。
  • @kartheek 问题是我无法在基于 last_modified 的排序之前加载我的所有密钥——甚至加载所有密钥都需要很长时间。也许你可以给我看一些你的意思的代码——也许我理解错了。
  • 如果有数百万个密钥,您无法使用 S3 API 有效地执行此操作。您将不得不使用前一天的 S3 清单,或者维护自己的密钥数据库,按照您想要的任何方式进行排序。
  • @jarmood 好的,我明白了。有没有办法可以加载更多。喜欢使用 fetch_more 函数或类似的东西?
  • @jarmood 甚至可以得到 1000 个(随机)已在 8 月修改过的密钥。

标签: python django amazon-web-services amazon-s3 boto


【解决方案1】:
import boto3

client = boto3.client('s3')

start_after = “”

response =  client.list_objects(Bucket='<bucket>', StartAfter =start_after,MaxKeys=1000)

您保存具有 LastModified 键的响应['Contents']。

'Contents': [
    {
        'Key': 'string',
        'LastModified': datetime(2015, 1, 1),
        'ETag': 'string',
        'Size': 123,
        'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'GLACIER'|'STANDARD_IA'|'ONEZONE_IA',
        'Owner': {
            'DisplayName': 'string',
            'ID': 'string'
        }
    },
],

从这 1000 条记录中获取最后一个键并将其分配给 start_after 变量,并在这一次发出另一个请求。

新请求开始获取在 startAfter 提供的密钥之后的密钥。

https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2

【讨论】:

  • 好的,我明白你的意思了。但是生成objs 是我遇到一些问题的部分。
【解决方案2】:

如果您不介意数据稍微过时,您可以使用Amazon S3 Inventory,它可以提供每日 CSV 文件,列出您在 Amazon S3 存储桶中的所有对象:

Amazon S3 清单提供逗号分隔值 (CSV) 或 Apache 优化的行列式 (ORC) 输出文件,这些文件每天或每周为 S3 存储桶或共享前缀(即,名称以公共字符串开头的对象)。

您可以解析此文件以获取 Keys 和 Last Modified 日期,然后按日期排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2011-06-26
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多