Too many items requested for the BatchWriteItem call

TL;DR — BatchWriteItem 每次调用最多接受 25 个 put/delete 操作(且合计 ≤16 MB)。你发送了超过 25 个,所以 DynamoDB 拒绝了整个请求。把你的项目拆分成每组不超过 25 个,并为每个分块发起一次 BatchWriteItem

含义

ValidationException: 1 validation error detected: Value '<your request>' at 'requestItems' failed to satisfy constraint: Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1]

# on DynamoDB Local the same call is rejected with a shorter sentence:
ValidationException: Too many items requested for the BatchWriteItem call

服务会在 <your request> 所在的位置原样回显你整个序列化后的请求——一个 26 个项目的批次大约是 12,000 个字符。

BatchWriteItem 跨一张或多张表批量处理单个的 PutRequest/DeleteRequest 操作——但单次调用被硬性限制在 25 个操作16 MB 数据。越过任一限制,DynamoDB 会在写入任何内容之前拒绝整个请求。它是一个 HTTP 400 ValidationException,属于客户端错误,在你调整批次大小之前不可重试。

为什么会发生

  • 在一次调用中写入一个大集合——把一个包含数百个项目的数组直接传入 BatchWriteItem 而不分块。
  • 分块循环的边界不对——按数量分批,却使用了超过 25 的限制,或者一个差一错误让 26 通过了。
  • 数的是表而不是操作——25 的限制是请求中所有表的操作总数,而不是每张表。
  • 载荷过大——即使操作数 ≤25,只要有任何单个项目超过 400 KB 或请求总量超过 16 MB,整个批次也会被拒绝。

如何修复

  1. 分块成每组 ≤25 个操作,并为每个分块发送一次 BatchWriteItem
  2. 处理 UnprocessedItems——BatchWriteItem 可能返回它未处理的项目(限流);用指数退避重试它们。即使在一个有效的 25 项批次中,这也是正常现象。
  3. 让每个批次保持在 16 MB 以下——项目较大时,你可能每次调用需要少于 25 个。
  4. 使用一个帮你缓冲的辅助工具——boto3 的 Table.batch_writer() 会自动分块写入并重发未处理的项目(Java SDK 的 Enhanced Client / v1 DynamoDBMapper 也会重试未处理的项目)。底层客户端和 JavaScript 文档客户端不会拆分超大的批次。

在 DynoTable 中测量

在批量加载数据之前,抽查 DynoTable 中的项目大小 — 使用 ⌘K 打开示例项目,并确认每个项目大小不超过 400 KB。 item size calculator 估计批量有效负载大小,以便你在加载程序运行之前选择一个安全的块大小。在运行完全导入之前,使用暂存 (⌘S) 测试针对开发表的小批量写入。使用 ⌘P 切换配置文件;在“设置”→“配置文件”下使用“Test Connection”配置它们。参见连接 AWS安装

来源

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。