GCP工作流调用Document AI触发内存超限错误求助
GCP工作流调用DocumentAI触发内存超限问题排查与解决
问题描述
我用GCP工作流结合Eventarc触发器对接Cloud Storage,实现存储桶接收文档时自动调用Document AI解析。但每次解析都会触发“内存超限”错误,测试文档仅120KB,且GCP工作流响应上限为2MB。一开始以为是日志输出响应导致的问题,改成把响应存到独立存储桶后还是报错,想问是不是需要先压缩Document AI的响应再存储?
当前使用的YAML代码:
main: params: [event] steps: - start: call: sys.log args: text: ${event} - vars: assign: - file_name: ${event.data.name} - mime_type: ${event.data.contentType} - input_gcs_bucket: ${event.data.bucket} - batch_doc_process: call: googleapis.documentai.v1.projects.locations.processors.process args: name: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/locations/" + sys.get_env("LOCATION") + "/processors/" + sys.get_env("PROCESSOR_ID")} location: ${sys.get_env("LOCATION")} body: gcsDocument: gcsUri: ${"gs://" + input_gcs_bucket + "/" + file_name} mimeType: ${mime_type} skipHumanReview: true result: doc_process_resp - store_process_resp: call: googleapis.storage.v1.objects.insert args: bucket: ${sys.get_env("OUTPUT_GCS_BUCKET")} name: ${file_name} body: ${doc_process_resp}
问题原因与解决办法
- 核心原因:Document AI返回的结构化响应包含文本、布局、实体等大量详细信息,体积可能远超原始文档大小——哪怕原始文档只有120KB,解析后的响应也可能突破2MB的工作流内存限制。
- 无需提前压缩响应,更高效的方案是避免将完整响应加载到工作流内存中,改用异步处理模式让Document AI直接把结果写入目标GCS桶:
- 将同步调用的
process接口替换为异步的batchProcess接口 - 在请求体中指定
outputConfig.gcsDestination,让解析结果直接输出到指定存储桶 - 工作流只需触发异步任务,无需等待和缓存完整响应,彻底规避内存占用问题
- 将同步调用的
- 修改后的关键代码片段:
- batch_doc_process: call: googleapis.documentai.v1.projects.locations.processors.batchProcess args: name: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/locations/" + sys.get_env("LOCATION") + "/processors/" + sys.get_env("PROCESSOR_ID")} location: ${sys.get_env("LOCATION")} body: inputDocuments: gcsDocuments: documents: - gcsUri: ${"gs://" + input_gcs_bucket + "/" + file_name} mimeType: ${mime_type} outputConfig: gcsDestination: uri: ${"gs://" + sys.get_env("OUTPUT_GCS_BUCKET") + "/"} skipHumanReview: true
- 补充优化:如果必须使用同步处理,可以在工作流中仅提取响应中需要的字段(而非存储完整响应),减少内存占用;也可检查并启用工作流的内存优化配置。
内容的提问来源于stack exchange,提问作者Lofton Gentry
相关产品推荐
相关产品推荐

