gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:15:24 25 4
gpt4 key购买 nike

项目当前维护 S3 存储桶,其中包含 1.5 GB 的大 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. 我应该使用不同的库/方法而不是读取内存中的所有内容

最佳答案

有一个使用 AWS Glue 的无服务器解决方案!(我差点没找到答案)

该解决方案分为两部分:

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

请参阅下面的代码,该代码解压缩 ZIP 文件并将内容放回到同一个存储桶中(可配置)。

如果有帮助请点赞:)

调用名为 YourGlueJob 的 Glue 作业的 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 Glue 作业脚本

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME','bucket','key'],)

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

import boto3
import zipfile
import io
from contextlib import closing

s3 = boto3.client('s3')
s3r = boto3.resource('s3')

bucket = args["bucket"]
key = args["key"]

obj = s3r.Object(
bucket_name=bucket,
key=key
)

buffer = io.BytesIO(obj.get()["Body"].read())
z = zipfile.ZipFile(buffer)
list = z.namelist()
for filerr in list:
print(filerr)
y=z.open(filerr)
arcname = key + filerr
x = io.BytesIO(y.read())
s3.upload_fileobj(x, bucket, arcname)
y.close()
print(list)


job.commit()

关于python - AWS Lambda (Python) 无法在 S3 中解压和存储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com