读出大量数据,速度慢,内存大,用户体验低如何解决呢?

2017-04-07 17:52:12 +08:00
 hujianxin

大家好,我遇到过一个任务。需要在数据库里面通过用户指定的时间段读取数据,但是如果用户指定的时间跨度大的话,数据量就超大,读取得是分钟级别的。

这个时候,如果我需要的数据可以分页显示的话,我可以分页查询,这个非常好好解决。

但是,如果我需要某种计算,非得需要全部的数据才能完成计算,这个时候,用户就需要在网页前面等数分钟,这种情况,用户体验,内存占用都是不可用级别的。

这种情况,大家一般怎么解决呢?非常感谢!

2257 次点击
所在节点    程序员
12 条回复
chenqh
2017-04-07 17:54:48 +08:00
加个小时统计,或者按天统计表
hujianxin
2017-04-07 17:56:20 +08:00
@chenqh 谢谢回复,你的意思是让程序后台定时运行吗?然后运行结果写入数据库?
kingmo888
2017-04-07 17:57:41 +08:00
需要计算的指标条目应该是固定的吧, 有变动的应该是时间?


如果上述属实,那应该有最短统计周期吧,比如看 1 小时的数据变化, 1 天的变化等等。

你在原始数据基础上应该增加计算好的数据项目。比如原始数据是分钟级的,你可以按照最低统计周期为频率,计算需要计算的指标,在用户需要调用时,只是把统计指标加总即可。
amghost
2017-04-07 18:07:32 +08:00
这不是典型的类 mapreduce 场景吗?大数据量还需要快速的处理结果,似乎是矛盾的吧?所以要么你把计算并行化能加快实时处理的速度,要么提前批处理好。
ovear
2017-04-07 18:13:02 +08:00
通过时间颗粒度控制总数据,就是所谓的抽样了
hujianxin
2017-04-07 18:16:22 +08:00
@kingmo888 谢谢回复,有道理,在很多需求的情况下你说的应该没问题,但是得看需求,多谢了。
hujianxin
2017-04-07 18:16:44 +08:00
@ovear 抽样也是个好方法,在很多情况下非常管用,感谢!
hujianxin
2017-04-07 18:18:09 +08:00
@amghost 大哥,突然觉着你说的好对啊,让我茅塞顿开啊,这本身就很矛盾啊!!

我试着再从需求方面找找原因。

谢谢
chenqh
2017-04-07 18:25:37 +08:00
@hujianxin 是的,应该有一张,小时统计表,按天统计表
Actrace
2017-04-07 18:43:01 +08:00
不歪需求的情况下。

本来我想说需要实时的话,多个几个读取用的从数据库来搞。不过看你的描述每次都要等数分钟,那么其实需要把一些关键的指标提取出来预处理完成。
类似于搜索引擎的做法,比如 sphinx 。这类组件叫做索引器,只做条件匹配的部分,并且针对具体的业务有合适的高速算法(或者是解决方案)。
这样,你的业务中计算的部分通过索引器解决通常是毫秒级别,再通过传统的数据库取出对应的条目,速度应该是非常快的。
ichou
2017-04-07 19:23:16 +08:00
如果需求不可控(搞不清产品想怎么玩),粒度不可控,这种实时还是上搜索引擎吧, ES 一类的
如果你能撕逼撕赢产品,不想增加额外成本,按楼上各位说的,按时间粒度做预处理
snnn
2017-04-07 20:24:42 +08:00
实在不行就上 spark

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

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

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

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

© 2021 V2EX