我的脚本正在运行,但我正在扫描的存储桶很大并且在一段时间后会超时。我该怎么做才能提高效率或从特定位置开始?
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”开头的对象开始。
答案 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: