You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda内存疑问:Max memory used统计逻辑与内存复用问题

AWS Lambda内存使用常见问题解答

一、Max memory used 具体统计的是什么?

  • Max memory used是Lambda函数单次执行周期内达到的内存使用峰值,它记录的是整个执行过程中内存占用的最高点——只要执行过程中某一刻用到了对应内存量,哪怕后续通过置空对象、调用垃圾回收释放了内存,这个峰值数值也不会改变。
  • 它不会统计所有曾被数据占用过的内存总和,只取执行期间的最大内存占用值。但只要这个峰值出现过,就会被固定记录,后续的内存回收操作无法降低这个数值。

二、Lambda配置内存是可复用还是一次性使用?

Lambda配置的内存不是“一次性使用”,但要理解清楚两个核心点:

  • Lambda的执行环境是可复用的(即常说的“预热环境”),配置的内存额度是该执行环境的最大可用内存上限。
  • 你遇到的问题本质和Python内存管理特性有关:当读取3GB文本文件时,decode('utf-8')生成的字符串对象占用的内存会被Python内存分配器接管,哪怕你把file_content置为None并调用gc.collect(),Python通常不会立刻把内存归还给操作系统,而是保留在自身内存池里供后续对象使用。这就导致操作系统层面仍会认为内存被Lambda进程占用,所以Lambda的内存统计不会下降,后续分配新对象时会优先使用内存池里的空间,若内存池不够才会向操作系统申请新内存,一旦超过配置的内存上限就会触发OOM错误。

代码优化建议

针对大文件场景,不要一次性读取全部内容到内存,改用流式处理逐行读取,能大幅降低内存峰值:

import boto3

def read_s3_file_stream(bucket_name, file_name):
    s3_client = boto3.client('s3')
    try:
        response = s3_client.get_object(Bucket=bucket_name, Key=file_name)
        # 按1MB分片逐行处理流数据
        for line in response['Body'].iter_lines(chunk_size=1024*1024):
            process_line(line.decode('utf-8'))
    except Exception as e:
        print(f"Error reading file from S3: {e}")

def process_line(line):
    # 在这里编写你的业务处理逻辑
    pass

bucket_name = 'myBucket'
file_name = 'bigFile_1.txt'
file_name_2 = 'bigFile_2.txt'

read_s3_file_stream(bucket_name, file_name)
read_s3_file_stream(bucket_name, file_name_2)

内容的提问来源于stack exchange,提问作者Shauny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:32:44