将 EFS 与 AWS Lambda 结合使用(内存问题)

Using EFS with AWS Lambda (memory issue)

我对 EFS 的用法和 lambda 的附加内存位置有疑问。我正在使用 python 和 pandas 对我的文件执行一些测试。如果文件不是那么大,它会很好用,但是如果文件超过 2-3 GB,lambda 会因为内存限制(同时使用最大内存和 lambda 时间)而死掉。文件最初位于 S3,我想知道在这种情况下是否可以使用 EFS?如果是这样,此解决方案需要什么。我需要将文件从 S3 传输到 EFS 才能打开它们吗?或者是否有更好的解决方案,我可以直接将文件从 S3 加载到 EFS 并使用 pandas 打开它们。还有超时限制,但我希望如果使用 EFS 的 lambda 更快,这不会成为问题。

据我所知,pandas 需要将整个文件装入内存。 原则上,您可以将更大的文件放入 Lambda 的内存中,因为您现在可以使用高达 10GB 的 RAM 配置 Lambda 函数。

这并不意味着您能够从 S3 读取一个 10GB 的文件并从中创建一个数据帧,因为为了 pandas 解析数据,它需要存储在磁盘(其中只有 500MB 可用)或内存中。

如果您将文件下载到内存中,它也会占用系统内存中的大小,然后您可以从中创建一个 pandas 数据框。 Pandas 数据结构可能比文件的原始字节大,所以我的猜测是您可以将文件从 S3 加载到内存中并将其转换为大约占内存容量 30-40% 的数据帧lambda 函数。

如果将该文件存储在 EFS 上,您将能够在内存中容纳更多内容,因为 pandas 可以从磁盘读取字节,因此您可能会多挤出几千兆字节。然而,这些 I/O 操作需要时间,而 Lambda 被限制为最多 15 分钟的运行时间。您可能还需要将该数据写入某处,这也需要时间。

底线: 将比这更大的文件加载到 Lambda 中可能不是一个好主意。如果可以的话,将数据集分解成更小的块并让 lambda 函数并行处理它们,或者选择像 Athena 或 EMR 或 Glue ETL 这样的服务,它们是为处理这些东西而构建的。