V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
redtea
V2EX  ›  Java

在堆不能超过 4G 的情况下,怎么通过 http 请求返回一个几百 MB 乃至上 GB 的 json 字符串?

  •  
  •   redtea · Sep 28, 2019 · 3901 views
    This topic created in 2415 days ago, the information mentioned may be changed or developed.
    这个 json 是一个千万条级别 List 序列化而成的。其中还要拿数据作一些处理,一直在报 OOM。
    8 replies    2019-10-04 21:40:42 +08:00
    tffy
        1
    tffy  
       Sep 29, 2019 via iPhone
    分成多个请求,一次获得一部分,后台一次只处理一部分
    redtea
        2
    redtea  
    OP
       Sep 29, 2019 via iPhone
    @tffy 不能多次,只能一次。
    340244120w
        3
    340244120w  
       Sep 30, 2019
    先把 json 存到硬盘,然后按一段一段的读取,一段一段的写入 response
    OutputStream os = response.getOutputStream();

    while((read = is.read(bytes))!= -1){
    os.write(bytes, 0, read);
    }
    os.flush();
    os.close();
    xuanbg
        4
    xuanbg  
       Oct 1, 2019
    对象存储,生成 url 客户端直接下载就行了吧
    yuikns
        5
    yuikns  
       Oct 1, 2019
    那样只能 hack 一下序列化了吧?
    比如结构为 { "status": true, "data": [ { elem0}, { elem1 }, .... ]}
    那么你只能先把 { "status": true, "data": [ 先写了,然后每个 element 单独序列化后写 response,最后补一个 ]}
    中间单独序列化类似 map-reduce,数据结构是独立的,应该问题不大
    yuikns
        6
    yuikns  
       Oct 1, 2019
    tcp 底层并不要求你一次把所有数据准备好,完全可以一段一段发的
    zjp
        7
    zjp  
       Oct 3, 2019 via Android
    直接操作输出流 + 流式序列化
    但是几百兆的数据网络一抖动就下载失败不能断点续传也太糟糕了
    hakono
        8
    hakono  
       Oct 4, 2019 via iPhone
    为什么一定要想着流式之类的
    直接把 json 保存到本地文件,然后交给 nginx 当作普通的一个大的静态文件下载下来不就行了。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   914 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 20:27 · PVG 04:27 · LAX 13:27 · JFK 16:27
    ♥ Do have faith in what you're doing.