Python 在AWS S3存储桶中的对象上迭代

Python 在AWS S3存储桶中的对象上迭代,python,amazon-web-services,amazon-s3,aws-cli,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 我遇到的第

我的脚本正在运行,但是我正在扫描的桶太大了,过了一会儿就超时了。我可以做些什么来提高效率,或者从一个特定的位置开始

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万个物体。我让我的代码打开文本文件寻找一些正则表达式,如果正则表达式上有匹配项,它就会输出对象名和找到的内容

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

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

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

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

2) 你从AWS查过雅典娜服务吗?Athena是一个交互式查询服务,直接从S3查询数据。AmazonAthena使用具有完全标准SQL支持的Presto,并使用各种标准数据格式,包括CSV、JSON、ORC和Parquet。如果您正在处理的文本数据符合Athena用例,那么花时间检查它可能是值得的。Athena是一个新的服务,我从未使用过它,但它听起来像是为了解决您的用例而创建的。以下是常见问题解答:

脚本是否在EC2实例上运行?如果您是从本地主机或您自己的数据中心运行它,那么将它移动到与bucket位于同一区域的EC2实例并从那里运行它可以减少延迟并提高性能。您可能正在从EC2实例运行它,但我想我会问。你有很多文件要查

2) 你从AWS查过雅典娜服务吗?Athena是一个交互式查询服务,它直接从S3查询数据。AmazonAthena使用具有完全标准SQL支持的Presto,并使用各种标准数据格式,包括CSV、JSON、ORC和Parquet。如果您正在处理的文本数据符合Athena用例,那么花时间检查它可能是值得的。雅典娜是一个新的服务,我从未使用过它,但听起来它是为解决您的用例而创建的。以下是常见问题解答:


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

相反,使用以1000为一组对对象进行翻页。然后,使用返回的
ContinuationToken
再次调用它


实际上,您需要一个
for
循环调用
list\u objects\u v2()
和另一个
for
循环,在循环中遍历每个对象。

如果Amazon S3 bucket中有大量对象,则
对象。all()
不是一种有效的迭代方法,因为它试图同时将它们加载到内存中

相反,使用以1000为一组对对象进行翻页。然后,使用返回的
ContinuationToken
再次调用它


实际上,您需要一个
for
循环调用
list_objects_v2()
和另一个
for
循环,在该循环中循环通过每个对象。

一些性能注意事项:您尝试过Amazon Athena吗?它旨在快速分析S3上的大规模数据集:一些性能注意事项:您尝试过AmazonAthena吗?它旨在快速分析S3上的大规模数据集:
object at 0x109e82d50>: Failed to establish a new connection: [Errno 60] Operation timed out',))