bigywater.tech
Flask · 117

大批量 JSON 响应

一次返回几十万行 JSON 会怎样?内存要多少?换成 orjson 能快多少?压缩划不划算?超过 gunicorn 超时会发生什么?这篇逐项量出来。

95 ms / 11 MB
10 万行 jsonify 的耗时与响应大小
约 8 倍
orjson 相对标准库 json.dumps 的速度
WORKER TIMEOUT
视图执行超过 gunicorn --timeout 时的日志

线性增长

实测 · 本机执行输出
       行数     耗时(ms)     响应(MB)       峰值内存(MB)
     1000        1.1       0.10            0.2
    10000        9.6       1.07            2.2
   100000       94.7      11.14           22.3

上一篇:Pydantic 在 Flask 中的使用;下一篇:Streaming JSON。

序列化方式

实测 · 本机执行输出
  json.dumps(默认,带空格分隔)               72.6 ms  12.44 MB
  json.dumps(紧凑 separators)          73.2 ms  11.14 MB
  orjson.dumps                        9.5 ms  11.14 MB

debug 模式

实测 · 本机执行输出
  debug=False compact=None 响应 103 KB
  debug=True  compact=None 响应 164 KB

gzip 压缩

实测 · 本机执行输出
  gzip level 1: 11.14 MB → 1.17 MB(10.5%),压缩耗时 21 ms
  gzip level 6: 11.14 MB → 1.17 MB(10.5%),压缩耗时 50 ms
  gzip level 9: 11.14 MB → 1.14 MB(10.2%),压缩耗时 104 ms

这里用 Python 的 gzip 模块测压缩比与耗时;反向代理(nginx)压缩见部署部分。

首字节时间与 worker timeout

实测 · 本机执行输出
  /big(10 万行,8.0 MB):收到响应头用时 119 ms,读完全部用时 124 ms,Content-Length 头 = 7992597
  /slow(睡 4 秒,gunicorn --timeout 2):客户端结果 HTTP 500,用时 2931 ms
  服务端日志: ['[2026-10-02 13:14:54 +0800] [97468] [INFO] Booting worker with pid: 97468', '[2026-10-02 13:14:57 +0800] [97458] [CRITICAL] WORKER TIMEOUT (pid:97468)', '[2026-10-02 13:14:57 +0800] [97494] [INFO] Booting worker with pid: 97494']

分步演示

大批量 JSON 响应
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。orjson 3.12.0、gunicorn sync worker
    • 没有验证:Flask-Compress 与 nginx gzip 的实际表现、brotli、分块传输下的客户端内存、浏览器解析大 JSON 的耗时、数据库取 10 万行本身的耗时与内存(见流式响应一篇)
    京ICP备2026067502号-1京公网安备11010502063487号