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

2019-09-28 10:36:41 +08:00
 redtea
这个 json 是一个千万条级别 List 序列化而成的。其中还要拿数据作一些处理,一直在报 OOM。
2945 次点击
所在节点    Java
8 条回复
tffy
2019-09-29 17:50:04 +08:00
分成多个请求,一次获得一部分,后台一次只处理一部分
redtea
2019-09-29 19:10:55 +08:00
@tffy 不能多次,只能一次。
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
2019-10-01 08:31:13 +08:00
对象存储,生成 url 客户端直接下载就行了吧
yuikns
2019-10-01 22:57:29 +08:00
那样只能 hack 一下序列化了吧?
比如结构为 { "status": true, "data": [ { elem0}, { elem1 }, .... ]}
那么你只能先把 { "status": true, "data": [ 先写了,然后每个 element 单独序列化后写 response,最后补一个 ]}
中间单独序列化类似 map-reduce,数据结构是独立的,应该问题不大
yuikns
2019-10-01 22:58:43 +08:00
tcp 底层并不要求你一次把所有数据准备好,完全可以一段一段发的
zjp
2019-10-03 22:59:00 +08:00
直接操作输出流 + 流式序列化
但是几百兆的数据网络一抖动就下载失败不能断点续传也太糟糕了
hakono
2019-10-04 21:40:42 +08:00
为什么一定要想着流式之类的
直接把 json 保存到本地文件,然后交给 nginx 当作普通的一个大的静态文件下载下来不就行了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/605035

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX