迭代 AWS S3 存储桶中的对象

Nat*_*ate 2 python amazon-s3 amazon-web-services aws-cli

我的脚本正在运行,但是我正在扫描的存储桶很大,并且在一段时间后超时。我可以做什么来提高效率或从特定位置开始?

import boto3

s3 = boto3.resource('s3')
b = s3.Bucket('my_bucket')

for obj in b.objects.all():
   # Open the file, run some RegEx to find some data. If it's found, output to a log file
Run Code Online (Sandbox Code Playgroud)

我遇到的第一个问题是桶的大小。大约有 150 万个物体。我的代码打开文本文件寻找一些正则表达式,如果正则表达式匹配,那么它会输出对象名称和找到的内容。

运行脚本大约一个小时后,它在抛出错误之前输入了大约 40k 对象:

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))
Run Code Online (Sandbox Code Playgroud)

或者

object at 0x109e82d50>: Failed to establish a new connection: [Errno 60] Operation timed out',))
Run Code Online (Sandbox Code Playgroud)

它正在搜索的搜索项是按字母顺序排列的,因此我们会说它通过了“E”部分,然后超时。我想从以“F”开头的对象开始。

Joh*_*ein 5

如果您的 Amazon S3 存储桶中有大量对象,那么这objects.all()不是一种有效的迭代方法,因为它会尝试将它们同时加载到内存中。

相反,应list_objects_v2()以 1000 个为一组对对象进行分页。然后,使用ContinuationToken返回的值再次调用它。

您实际上需要一个for循环调用list_objects_v2()和另一个for循环来循环每个对象。