Python 3.x 使用python boto3定期从S3高效下载文件

Python 3.x 使用python boto3定期从S3高效下载文件,python-3.x,amazon-web-services,amazon-s3,boto3,Python 3.x,Amazon Web Services,Amazon S3,Boto3,我正在尝试下载添加到S3存储桶中的最近24小时的新文件-但是,S3存储桶包含大量文件 据我所知,s3存储桶使用平面结构,其中文件根据密钥名按字母顺序存储 我编写了一个脚本,使用线程提取存储在bucket上的所有数据。但是,现在我有了本地系统上的所有文件,我想每24小时更新一次数据库,更新到S3上的任何新文件 大多数论坛建议使用“上次修改”搜索正确的文件,然后下载与指定数据匹配的文件 首先,从s3 bucket下载文件会改变“上次修改”吗?看起来这可能会引起问题 其次,这似乎是一个非常有效的过程—

我正在尝试下载添加到S3存储桶中的最近24小时的新文件-但是,S3存储桶包含大量文件

据我所知,s3存储桶使用平面结构,其中文件根据密钥名按字母顺序存储

我编写了一个脚本,使用线程提取存储在bucket上的所有数据。但是,现在我有了本地系统上的所有文件,我想每24小时更新一次数据库,更新到S3上的任何新文件

大多数论坛建议使用“上次修改”搜索正确的文件,然后下载与指定数据匹配的文件

首先,从s3 bucket下载文件会改变“上次修改”吗?看起来这可能会引起问题

其次,这似乎是一个非常有效的过程——每次都在整个存储桶中搜索具有正确“上次修改”的文件,然后下载。。。特别是因为bucket包含大量的文件。有没有更好的方法来实现这一点

最后,pre-fix过滤器是否使该过程更加高效?或者这也需要搜索所有文件


提前谢谢

我将从另一个方向来回答这个问题。。。你说得对,这个过程效率很低。我不确定您正在处理的数据的数量和大小,但您基本上是说您需要一个批处理作业来下载新文件。搜索大量密钥是错误的做法,在AWS中是一种反模式。在根目录下,您需要在新文件进入时跟踪它们

解决这个问题的最佳方法是使用Lambda函数(python,因为您已经很熟悉了),当一个新对象存放在S3 bucket中时会触发该函数。当新文件进入时,该函数做什么

如果必须解决此问题,我会执行以下操作之一:

  • 将新文件的键与时间戳一起添加到DynamoDB表中。一天中,只要有新文件出现,该表就会增长。在运行批处理作业时,读取该表的内容并下载所有引用的键,从DynamoDB表中删除该行。如果您想变得更有趣,您可以基于timestamp列进行查询,而从不清除表中的行
  • 将文件复制到第二个“拾取”存储桶。当批处理作业运行时,您只需读取此拾取桶中的所有文件并将其删除。你必须小心这个。这很简单,但是你必须考虑你正在存放的文件的大小/数量,这样你就不会碰到Limbda 5min执行限制。

我真的不能推荐一个而不是另一个,因为我不熟悉您的规模、成本偏好等。对于一个典型的用例,我可能会选择DynamoDB表格解决方案。我想你会惊讶于DynamoDB在Python3中是多么容易与之交互。

我将从另一个方向来回答这个问题。。。你说得对,这个过程效率很低。我不确定您正在处理的数据的数量和大小,但您基本上是说您需要一个批处理作业来下载新文件。搜索大量密钥是错误的做法,在AWS中是一种反模式。在根目录下,您需要在新文件进入时跟踪它们

解决这个问题的最佳方法是使用Lambda函数(python,因为您已经很熟悉了),当一个新对象存放在S3 bucket中时会触发该函数。当新文件进入时,该函数做什么

如果必须解决此问题,我会执行以下操作之一:

  • 将新文件的键与时间戳一起添加到DynamoDB表中。一天中,只要有新文件出现,该表就会增长。在运行批处理作业时,读取该表的内容并下载所有引用的键,从DynamoDB表中删除该行。如果您想变得更有趣,您可以基于timestamp列进行查询,而从不清除表中的行
  • 将文件复制到第二个“拾取”存储桶。当批处理作业运行时,您只需读取此拾取桶中的所有文件并将其删除。你必须小心这个。这很简单,但是你必须考虑你正在存放的文件的大小/数量,这样你就不会碰到Limbda 5min执行限制。

我真的不能推荐一个而不是另一个,因为我不熟悉您的规模、成本偏好等。对于一个典型的用例,我可能会选择DynamoDB表格解决方案。我想你会惊讶于DynamoDB在Python3中是多么容易与之交互。

另一个要添加到这里的解决方案

您可以在S3上启用库存,它为您提供桶中所有文件的每日报告,包括元数据,如CSV格式的日期

生成CSV后(第一个可能需要48小时),您可以生成一个新文件列表,以便相应地下载。前面提到的dynamo lambda选项肯定会为您提供更实时的解决方案


另外,我认为修改日期只受PUT和POST操作的影响

这里要添加的另一个解决方案

您可以在S3上启用库存,它为您提供桶中所有文件的每日报告,包括元数据,如CSV格式的日期

生成CSV后(第一个可能需要48小时),您可以生成一个新文件列表,以便相应地下载。前面提到的dynamo lambda选项肯定会为您提供更实时的解决方案


另外,我认为修改日期只受PUT和POST操作的影响。注意:您还可以使用
awss3sync
命令。但是,如果文件太多,速度会慢一些。旁注:您也可以使用
aws s3 sync
命令。但是,如果文件太多,速度会慢一点。谢谢你的回答。一个问题——不会