AWS Lambda(Python)无法在S3中解压缩和存储文件

2024-03-28 18:57:03 发布

您现在位置:Python中文网/ 问答频道 /正文

项目目前维护s3bucket,其中包含一个1.5gb的大zip大小,包含.xpt和.sas7dbat文件。解压文件大小为20 GB。在

尝试解压缩文件并将相同的文件夹结构推送到S3

以下代码适用于较小的zip文件,但对于大型zip文件(1.5GB)则失败:

for obj in bucket.objects.all():
    #file_name = os.path.abspath(obj.key) # get full path of files
    key = urlparse(obj.key.encode('utf8'))
    obj = client.get_object(Bucket='my-zip-bucket', Key=obj.key)

    with io.BytesIO(obj["Body"].read()) as tf:
        # rewind the file
        tf.seek(0)

        with zipfile.ZipFile(tf, mode='r') as zipf:
            for file in zipf.infolist():
                fileName = file.filename
                putFile = client.put_object(Bucket='my-un-zip-bucket-', Key=fileName, Body=zipf.read(file))
                putObjects.append(putFile)

错误:内存大小:3008 MB已使用的最大内存:3008 MB

我想验证:

  1. AWS Lambda不是适用于大文件的解决方案吗?在
  2. 我是否应该使用不同的库/方法而不是读取内存中的所有内容

Tags: 文件pathkeyinclientobjforget
2条回答

如本AWS Lambda Limits link所述:

但是AWS Lambda规定了一些限制,例如,部署包的大小或每次调用分配Lambda函数的内存量。

这里,您遇到的问题是因为需要“每次调用分配Lambda函数的内存量”。不幸的是,Lambda不是适用于此情况的解决方案。您需要使用EC2方法。在

当你的整体内存需求很高时,我不认为Lambda是一个很好的解决方案。我不是关于指定的文件类型是如何工作的,但是一般来说,读取/处理大文件使用分块方法来避免大内存需求。分块方法是否有效取决于您的业务需求。在

有一个使用AWS胶水的无服务器解决方案!(想清楚这一点,我差点就死了)

此解决方案分为两部分:

  1. 一个lambda函数,在上载ZIP文件时由S3触发并创建GlueJobRun-将S3对象键作为参数传递给Glue。在
  2. 解压文件(内存中)的胶水作业并上传回S3。在

请参阅下面我的代码,其中解压缩ZIP文件并将内容放回同一个bucket(可配置)。在

如有帮助,请投赞成票:)

调用名为YourGlueJob的粘合作业的Lambda脚本(python3)

import boto3
import urllib.parse

glue = boto3.client('glue')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    print(key)    
try:
    newJobRun = glue.start_job_run(
        JobName = 'YourGlueJob',
        Arguments = {
            ' bucket':bucket,
            ' key':key,
        }
        )
    print("Successfully created unzip job")    
    return key  
except Exception as e:
    print(e)
    print('Error starting unzip job for' + key)
    raise e         

解压文件的AWS胶水作业脚本

^{pr2}$

相关问题 更多 >