程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了加速 Python S3 复制/删除功能大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决加速 Python S3 复制/删除功能?

开发过程中遇到加速 Python S3 复制/删除功能的问题如何解决?下面主要结合日常开发的经验,给出你关于加速 Python S3 复制/删除功能的解决方法建议,希望对你解决加速 Python S3 复制/删除功能有所启发或帮助;

我编写了一个函数来清理我的一个 S3 存储桶中的旧文件。该函数从文件夹中获取对象列表,检查它们是否超过一周,如果是,则将它们移动到另一个文件夹并从原始文件夹中删除它们。

问题是我有数百万个旧文件,而这个 lambda 每 15 分钟只处理大约 6000 个。我需要显着加快 lambda 的运行时间,以便在合理的时间范围内处理所有内容

这是函数代码

#This function cycles through an S3 bucket and moves any legacy files to a processing folder. This function also allows us to exclude certain filetypes If you have any other filetypes you'd like to exclude,be sure to add an exclusion to line 21

import Json
import boto3
import botocore
import random
import time
import os
from datetiR_134_11845@e import datetiR_134_11845@e,timedelta,timezone


s3 = boto3.resource('s3')


def moveAllfiles(bucket,year):
    count = 0
    dayBuffer = 7
    # For every object in the bucket under the prefix
    for obj in bucket.objects.filter(Prefix=prefix + year + "/"):
        filepath = obj.key
        # If the item isn't a special file
        if "SPECIAL" not in filepath:
            filepathList = filepath.split("/")
            # if the file's year matches the year we're processing,just a safety check
            if filepathList[1] == year:
                folder = (filepathList[2])
                # If the file isn't already processed
                if folder != "Processed":
                    copy_source = {
                        'Bucket': bucket.name,'Key': filepath
                    }
                    today = datetiR_134_11845@e.Now()
                    delta = today - timedelta(days=dayBuffer)
                    if obj.last_modifIEd.replace(tzinfo=NonE) < delta:
                        try:
                            s3.Meta.clIEnt.copy(copy_source,bucket.name,"Prefix/" + year + "/Processed/" + filepathList[2] + "/" + filepathList[3])
                            print("file " + filepath + " moved to processed folder")
                        except Exception as e:
                            print("error while copying")
                            print(E)
                            raise
                        s3.object(bucket.name,filepath).delete()
                        print("file " + filepath + " deleted")
                        count = count + 1
                        print(count)
    return count


def lambda_handler(event,context):
    try:
        bucket = s3.bucket(os.environ['BUCKEt_name'])
        #Change the year variable to handle different subdirectorIEs
        year = "2008"

        count = moveAllfiles(bucket,year)
        print("removed " + str(count) + " files from " + year)
    except Exception as e:
        print("function timed out")
        print(E)
        print("removed " + str(count) + " files from " + year)
        raise

为了澄清为什么会这样运行,在我们的文件夹中,我们还有不应移动的文件类型。这会在复制/删除之前仔细检查有问题的文件是否不是其中之一。我们还需要保留相对较新的文件,因此我添加了一个检查以仅移动超过 1 周的文件。我认为我可以使用生命周期规则满足我的所有要求,但我的合作伙伴更愿意仅在处理文件夹而不是主文件夹上运行生命周期规则。

所以在我看来,这里的主要问题是所有网络呼叫。这样做的正确方法是什么?构建需要移动的所有内容的列表,然后使用某种承诺结构将它们全部批量处理?据我所知,Boto3 不允许批量上传/删除。我也不主张在 15 分钟的时间范围内建立完整的列表。

基本上,我正在寻找加快此过程的方法。我可以稍微照顾一下,但每 15 分钟处理的文件数量确实需要增加 10 倍才能成为一个合理的解决方案

感谢您的时间!

解决方法

从 the boto3 docs 开始,copy() 和 @H_900_9@meta.client.copy() 都导致“托管传输,如有必要,将在多个线程中执行多部分复制”。这听起来像是将每个对象下载到发出复制命令的计算机,然后将对象上传回 S3。

如果您的对象小于 5GB,那么您可以使用 copy_from() 方法将对象从一个 S3 位置复制到另一个位置,而无需下载和重新上传对象内容,这应该会显着增加应用程序的速度。

,

仅供将来偶然发现此问题的任何人使用。 Mark 的回答确实将函数速度提高了约 33%,这不足以处理 S3 中的文件数量。@R_801_9358@个问题,我创建了一个新函数,该函数将为 S3 中的每个文件夹生成一个“moveAllFiles”实例。基本上,不是让一个 lambda 一次处理一个文件夹,而是让 200 个 lambda 一次处理 200 个文件夹。

此解决方案可能不适用于您的存储桶中只有大量文件的人。首先,确保您不能利用生命周期规则。如果这由于某种原因站不住脚,您可以做的是编写一个 lambda,从存储桶中随机提取文件,评估它们,并在应该删除它们时将其删除。我没有实现这个,因为

  1. 我不想弄清楚如何从 S3 大规模提取随机文件

  2. 我不想处理潜在的并发问题(如果一个文件被一个 lambda 删除而另一个正在复制它怎么办?)

这两个绝对是可以解决的,如果您实施了,请分享您的解决方案!

大佬总结

以上是大佬教程为你收集整理的加速 Python S3 复制/删除功能全部内容,希望文章能够帮你解决加速 Python S3 复制/删除功能所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:Python加速