V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
redtea
V2EX  ›  Java

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

  •  
  •   redtea · 2019-09-28 10:36:41 +08:00 · 2933 次点击
    这是一个创建于 1664 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个 json 是一个千万条级别 List 序列化而成的。其中还要拿数据作一些处理,一直在报 OOM。
    8 条回复    2019-10-04 21:40:42 +08:00
    tffy
        1
    tffy  
       2019-09-29 17:50:04 +08:00 via iPhone
    分成多个请求,一次获得一部分,后台一次只处理一部分
    redtea
        2
    redtea  
    OP
       2019-09-29 19:10:55 +08:00 via iPhone
    @tffy 不能多次,只能一次。
    340244120w
        3
    340244120w  
       2019-09-30 09:32:55 +08:00
    先把 json 存到硬盘,然后按一段一段的读取,一段一段的写入 response
    OutputStream os = response.getOutputStream();

    while((read = is.read(bytes))!= -1){
    os.write(bytes, 0, read);
    }
    os.flush();
    os.close();
    xuanbg
        4
    xuanbg  
       2019-10-01 08:31:13 +08:00
    对象存储,生成 url 客户端直接下载就行了吧
    yuikns
        5
    yuikns  
       2019-10-01 22:57:29 +08:00
    那样只能 hack 一下序列化了吧?
    比如结构为 { "status": true, "data": [ { elem0}, { elem1 }, .... ]}
    那么你只能先把 { "status": true, "data": [ 先写了,然后每个 element 单独序列化后写 response,最后补一个 ]}
    中间单独序列化类似 map-reduce,数据结构是独立的,应该问题不大
    yuikns
        6
    yuikns  
       2019-10-01 22:58:43 +08:00
    tcp 底层并不要求你一次把所有数据准备好,完全可以一段一段发的
    zjp
        7
    zjp  
       2019-10-03 22:59:00 +08:00 via Android
    直接操作输出流 + 流式序列化
    但是几百兆的数据网络一抖动就下载失败不能断点续传也太糟糕了
    hakono
        8
    hakono  
       2019-10-04 21:40:42 +08:00 via iPhone
    为什么一定要想着流式之类的
    直接把 json 保存到本地文件,然后交给 nginx 当作普通的一个大的静态文件下载下来不就行了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4215 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 01:02 · PVG 09:02 · LAX 18:02 · JFK 21:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.