Java ,大量对象内存中计算, oom 怎么处理哇。

2022-03-20 19:48:24 +08:00
 frank1256

rt ,

遇到个问题,需要查询 100 条记录查到内存中,然后进行计算。我内存很小,总是 oom 。就是单纯的内存不够。有啥好办法吗?

mat 工具打开 dump ,里面全是 mysql 的 jdbc 对象。。。

最高峰 300w 条,也没啥精力再去弄大数据啥的了。老板只给了 8g 。

小弟能想到的就是,分批查询,一批一批计算。靠谱吗?

有什么好办法吗,大佬们

5732 次点击
所在节点    Java
57 条回复
leaves615
2022-03-20 23:14:04 +08:00
文件缓存、流计算
leaves615
2022-03-20 23:14:36 +08:00
只读取用于计算的字段。
matrix67
2022-03-20 23:17:46 +08:00
这是挟泰山以超北海么😥
frank1256
2022-03-20 23:26:22 +08:00
@CEBBCAT 大佬我不太明白你说的负载是啥。就是现在的情况是,物理机 8g ,我给的堆内存 7g ,我有个需求,统计单表 30 天的记录的维度指标。比如 30 天内的,top10 ,平均值之类的。需求的某些字段还会在其他的表或者缓存里。有些还要计算公式,用 sql 太麻烦了。就打算读到内存里去计算。但是数量特别大的时候就会内存不够。实际情况里,程序还有其他地方用到缓存,或者还有其他的 query ,也就是说我这个统计能用的缓存很少。
frank1256
2022-03-20 23:26:49 +08:00
@leaves615 这个想到了,在优化
night98
2022-03-20 23:30:56 +08:00
10 个线程每个线程查 100 条,然后更新原子变量,完事。一次性加载一百万条,只能加钱。
Brian1900
2022-03-21 03:56:14 +08:00
LIMIT 分批就行了吧,想要一次性读就得加机器呗
msg7086
2022-03-21 04:13:20 +08:00
如果对性能要求高,就加内存。内存才多少钱,一台 384G 内存的服务器也就几百刀就能买到。
如果要省钱,那就先分批读出来写入单独的数据库中(相当于做数据快照),然后再慢慢分批处理算结果。
lsk569937453
2022-03-21 04:19:42 +08:00
这种百万级别数据的统计直接大数据计算平台(hardoop/spark)搞起啊
mingl0280
2022-03-21 04:45:14 +08:00
为啥要一次读 100 万再计算?这是什么神奇的操作?
mingl0280
2022-03-21 04:46:17 +08:00
@frank1256 据我所知常见的统计学指标没有任何一个需要加载 100 万数据才能计算的
xuanbg
2022-03-21 07:07:44 +08:00
为啥不写 sql 去统计?
gam2046
2022-03-21 07:27:38 +08:00
一次业务操作需要读取百万条记录显然是不合理的。尝试业务流程上的优化。如果只是一些统计汇总的任务,完全没必要把所有记录加载到内存后处理。流式的处理并不需要什么内存空间。甚至还不如直接在数据库中汇总后再返回。
sagaxu
2022-03-21 08:54:47 +08:00
top10 ,平均值是不需要一次全部读入内存的,可以流式处理
liangkang1436
2022-03-21 09:03:15 +08:00
楼主之所以提出这样的问题很有可能就只是一个单独的需求,为了谁一个需求去部署一个大数据框架很不经济,所以常规的做法应该就是每天定时统计,最后前台展示的时候从每天定时统计的表里面去取数据
summerLast
2022-03-21 09:39:44 +08:00
32 楼给了思路,还有另一种方式 就是 能否 100w 分批查 与分批计算,否的话就让对象尽量的小 而非有过多冗余信息
X0ray
2022-03-21 09:44:59 +08:00
可以参考下 aggregate function 的思路
limbo0
2022-03-21 09:48:54 +08:00
典型的 mapreduce
wqhui
2022-03-21 09:52:07 +08:00
楼上的流式计算 OR 分批汇总计算正解,或者尝试减少单条记录的大小
frank1256
2022-03-21 09:57:39 +08:00
@liangkang1436
@sagaxu
@summerLast
@X0ray
@wqhui
感谢回答,有一些思路了

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

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

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

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

© 2021 V2EX