Python 提高从s3读取lambda代码的性能

Python 提高从s3读取lambda代码的性能,python,amazon-web-services,file,amazon-s3,aws-lambda,Python,Amazon Web Services,File,Amazon S3,Aws Lambda,我正在从s3 bucket读取一个大的json文件。lambda在一秒钟内被调用数百次。当并发性较高时,lambda开始超时 有没有更有效的方法来编写下面的代码,这样我就不必每次都从S3下载文件,也不必跨lambda的不同实例重用内存中的内容:-) 文件内容一周只更改一次 我无法分割文件(由于json结构),必须立即读取 s3 = boto3.resource('s3') s3_bucket_name = get_parameter('/mys3bucketkey/') bucket = s3.

我正在从s3 bucket读取一个大的json文件。lambda在一秒钟内被调用数百次。当并发性较高时,lambda开始超时

有没有更有效的方法来编写下面的代码,这样我就不必每次都从S3下载文件,也不必跨lambda的不同实例重用内存中的内容:-)

文件内容一周只更改一次

我无法分割文件(由于json结构),必须立即读取

s3 = boto3.resource('s3')
s3_bucket_name = get_parameter('/mys3bucketkey/')
bucket = s3.Bucket(s3_bucket_name)

try:
    bucket.download_file('myfile.json', '/tmp/' + 'myfile.json')
except:
    print("File to be read is missing.")

with open(r'/tmp/' + 'myfile.json') as file:
    data = json.load(file)

也许,您没有达到请求速率限制,但值得尝试使用另一个前缀复制同一个S3文件

一种可能的解决方案是通过将JSON文件放入函数代码中来避免查询S3。此外,您可能希望将其添加为Lambda层,并从Lambda加载/opt:在这种情况下,您可以通过添加另一个Lambda来自动更新s3文件,该Lambda将由s3更新和调用触发


作为长期解决方案,请检查Fargate,您可以使用它构建基于容器的低延迟服务并将文件放入容器。

执行Lambda函数时,它可以检查
/tmp/
中是否存在文件,因为容器可能会被重复使用

  • 如果没有,函数可以下载它
  • 如果文件已经存在,则无需下载。就用它吧

但是,您必须弄清楚如何处理每周更新。也许根据日期更改文件名?或者检查文件上的时间戳以查看是否需要新的时间戳?

此代码是在Lambda处理程序函数内部还是外部?“重用内存中的内容”是什么意思?(因为如果您在处理程序内部阅读,我建议将其移到外部,但这意味着文件内容存储在内存中)这似乎是Lambda的一个糟糕用法。我知道它可以扩展,但是与一个合适的EC2集群相比,它的成本要高得多。文件每周更改一次这一事实意味着它非常适合某种缓存。但是Lambda使得缓存变得困难。根据您对数据的处理情况,即使是较小的服务器也应该能够继续大幅降低您的成本。这还不算经常从S3读取数据的成本,你说“Lambda开始超时”。Lambda函数的超时时间是多少?如果您增加超时时间,它是否有效?很抱歉,我没有发布整个代码。这段代码是处理程序的一部分,它所做的工作不仅仅是从S3读取文件。它根据json上的数据进行外部HTTP请求调用。我意识到这是个糟糕的设计。我基本上将文件的读取拆分为一个单独的lambda,该lambda被调用一次,然后调用(许多实例)另一个lambda,该lambda只进行外部HTTP调用。