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

在AWS Lambda中使用PyMuPDF读取PDF时遇任务超时问题

解决AWS Lambda读取S3 PDF超时问题

问题情况

在AWS Lambda中读取S3桶内的PDF文件,需提取文本并翻译,本地Notebook运行正常,但Lambda执行时CloudWatch日志报错:task timed out after 3.01 seconds。相关代码片段如下:

import fitz
import base64
from io import BytesIO
from PIL import Image
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    client_textract = boto3.client('textract')
    translate_client = boto3.client('translate')
    try:
        
        print("Inside handler")  
        s3_bucket = "my_bucket"
        pdf_file_name = 'sample.pdf'
        pdf_file = s3.get_object(Bucket=s3_bucket, Key=pdf_file_name)
        file_content = pdf_file['Body'].read()
        print("Before reading ")
        with fitz.open(stream=file_content, filetype="pdf") as doc:
               
            

解决方案

1. 调高Lambda超时时间

Lambda默认超时仅3秒,处理PDF(尤其是大文件)完全不够。进入Lambda控制台的配置>常规配置,把超时时间调整为10-30秒(根据PDF大小灵活设置)。

2. 优化代码逻辑与依赖

  • 移除未使用的依赖:代码里导入的base64、PIL如果没用到,直接删掉,减少冷启动时间和内存占用。
  • 避免一次性加载整个PDF:用fitz读取时,逐页处理而非一次性加载全部内容,降低内存消耗:
    with fitz.open(stream=file_content, filetype="pdf") as doc:
        for page in doc:
            text = page.get_text()
            # 后续翻译逻辑
    

3. 提升Lambda内存配置

Lambda的CPU、网络带宽和内存成正比,内存不足会导致处理速度变慢。可以把内存从默认128MB提升到512MB或更高,直接提升执行效率。

4. 改用Textract异步处理

没必要自己下载PDF并解析,直接用Textract的异步接口处理S3上的PDF,避免Lambda长时间等待:

import boto3

def lambda_handler(event, context):
    textract = boto3.client('textract')
    translate_client = boto3.client('translate')
    
    try:
        s3_bucket = "my_bucket"
        pdf_file_name = 'sample.pdf'
        
        # 触发Textract异步文本提取
        response = textract.start_document_text_detection(
            DocumentLocation={
                'S3Object': {
                    'Bucket': s3_bucket,
                    'Name': pdf_file_name
                }
            }
        )
        
        # 返回任务ID,后续可通过另一个Lambda轮询处理结果
        return {"textract_job_id": response['JobId']}
        
    except Exception as e:
        print(f"错误信息: {str(e)}")
        raise e

5. 优化冷启动

如果是冷启动导致的超时:

  • 用Lambda层管理依赖,减少部署包体积
  • 配置预留并发,让函数提前初始化好
  • 精简代码,只保留核心逻辑

内容的提问来源于stack exchange,提问作者self.Fool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:19