在Python中超過AWS Lambda記憶體限制

2024-04-19 12:37:24 发布

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

我正在找一些关于这个项目的建议。我的想法是使用Python和Lambda来聚合数据并对网站做出响应。日期和动态参数可以是主要参数。在

项目要求:

  • 从存储在JSON中的月报表文件中读取数据(每个文件包含大约3000个证券,大小为1.6mb)
  • 将数据汇总到不同的桶中,显示每个桶的计数和回报(就我们的目的而言,假设桶是行业和市值范围,可能会有所不同)
  • 在网站上显示聚合数据

我面临的问题 我已经在AWS Lambda中成功地实现了这一点,但是在测试数据为20年的请求时(是的,我得到了它们),我开始触及AWS Lambda中的内存限制。在

我使用的流程: 所有文件都存储在S3中,所以我使用boto3库来获取这些文件,并将它们读入内存。这仍然很小,没有任何实际意义。在

我使用json.loads将文件转换为pandas数据帧。我把所有的文件都加载到一个大数据帧中。-这就是它耗尽内存的地方。在

然后我使用groupby将数据帧传递给自定义聚合以获得结果。这部分没有我想的那么快,但它能满足我的需要。在

最终结果数据帧,然后转换回JSON,小于500 MB。在

当它在lambda外本地工作时,整个过程大约需要40秒。
我尝试过用线程运行这个程序,同时处理单个帧,但是性能下降到大约1分30秒。在

虽然我不想放弃一切重新开始,但如果有更有效的方法来处理这个问题,我愿意这么做。旧的程序可以完成内部的所有操作节点.js不使用lambda,花了将近3分钟的时间来生成。在

当前使用的代码 我不得不清理一下这个来取出一些项目,但这里是使用的代码。 将数据从S3读入JSON这将产生一个字符串数据列表。在

 while not q.empty():
            fkey = q.get()


            try:
                obj = self.s3.Object(bucket_name=bucket,key=fkey[1])
                json_data = obj.get()['Body'].read().decode('utf-8')

                results[fkey[1]] = json_data
            except Exception as e:
                results[fkey[1]] = str(e)
            q.task_done()

遍历JSON文件以构建一个用于工作的数据帧

^{pr2}$

Tags: 文件数据项目lambda内存代码程序aws