在堆不能超过 4G 的情况下,怎么通过 http 请求返回一个几百 MB 乃至上 GB 的 json 字符串? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
redtea
V2EX    Java

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

  •  
  •   redtea 2019-09-28 10:36:41 +08:00 3619 次点击
    这是一个创建于 2210 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个 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     Solana     4950 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 03:55 PVG 11:55 LAX 20:55 JFK 23:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86