我正在尝试在AWS lambda中将数据从CSV转换为JSON(使用Python 3(。文件的大小为65MB,因此在完成进程之前它的获取超时,整个执行失败。
我需要知道如何处理这样一种情况,即AWS Lambda应该能够在超时期内处理最大数据集,而剩余的有效载荷应该保存在S3存储桶中。
下面是转换代码
import json
import boto3
import csv
import os
json_content = {}
def lambda_handler(event, context):
s3_source = boto3.resource('s3')
if event:
fileObj=event['Records'][0]
fileName=str(fileObj['s3']['object']['key'])
eventTime =fileObj['eventTime']
fileObject= s3_source.Object('inputs3', fileName)
data = fileObject.get()['Body'].read().decode('utf-8-sig').split()
arr=[]
csvreader= csv.DictReader(data)
newFile=getFile_extensionName(fileName,extension_type)
for row in csvreader:
arr.append(dict(row))
json_content['Employees']=arr
print("Json Content is",json_content)
s3_source.Object('s3-output', "output.json").put(Body=(bytes(json.dumps(json_content).encode('utf-8-sig'))))
print("File Uploaded")
return {
'statusCode': 200,
'fileObject':eventTime,
}
AWS Lambda功能配置:
内存:640 MB
超时:15分钟
由于函数超时,您只有两个选项:
- 增加分配的内存量。这也会增加分配给函数的CPU数量,因此应该运行得更快。但是,这可能不足以避免超时
或
- 不要使用AWS Lambda
AWS Lambda功能最常见的用例是小型微服务,有时只运行几秒钟甚至几秒钟。
如果你的用例运行超过15分钟,那么它可能不是AWS Lambda的好候选者。
您可以考虑其他选择,例如在AmazonEC2实例上运行代码或使用Fargate容器。
看起来您的函数内存不足:
Memory Size: 1792 MB Max Memory Used: 1792
此外,它只运行了12分钟:
Duration: 723205.42 ms
(723秒≈12分钟(
因此,您应该:
- 增加内存(但成本更高(,或
- 更改您的程序,这样您就可以不断地将JSON字符串写入本地磁盘文件
/tmp/
,然后将生成的文件上传到AmazonS3,而不是在内存中累积JSON字符串
但是,提供给AWS Lambda函数的最大磁盘存储空间是512MB,而且您的输出文件似乎比这个大。因此,增加内存将是唯一的选择。为Lambda函数分配更多资源的相关费用增加表明,使用EC2或Fargate可能比使用Lambda更好。