迭代AWS S3存储桶中的对象

时间:2017-01-11 21:49:37

标签: python amazon-web-services amazon-s3 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

我遇到的第一个问题是铲斗的大小。它大约有150万个对象。我有我的代码打开文本文件寻找一些RegEx,如果RegEx上有匹配,那么它输出对象名称和找到的内容。

在运行脚本大约一个小时后,它会在抛出错误之前使其大约有40k个对象:

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))

object at 0x109e82d50>: Failed to establish a new connection: [Errno 60] Operation timed out',))

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

2 个答案:

答案 0 :(得分:2)

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

相反,使用list_objects_v2()以1000个为一组翻阅对象。然后,使用返回的ContinuationToken再次调用它。

你将有效地需要一个for循环调用list_objects_v2()和另一个循环遍历每个对象的for循环。

答案 1 :(得分:1)

1)您的脚本是否在EC2实例上运行?如果从本地主机或您自己的数据中心运行它,将其移动到与存储区相同的区域中的EC2实例并从中运行它可以减少延迟并提高性能。您可能正在从EC2实例运行它,但我想我会问。你有很多文件要经过!

2)您是否从AWS检查过Athena服务? Athena是一种交互式查询服务,可直接从S3查询数据。 Amazon Athena使用Presto提供完全标准的SQL支持,并使用各种标准数据格式,包括CSV,JSON,ORC和Parquet。如果您使用的文本数据符合Athena用例,则可能值得花时间查看它。 Athena是一项新服务,我从未使用它,但听起来它是为了解决你的用例而创建的。这是FAQ:

https://aws.amazon.com/athena/faqs/