API 的设计问题

2016-11-28 09:19:43 +08:00
 hujianxin

大家好,我需要在数据库获取十几万条数据,然后通过得到的这些数据,计算得到十几个参数(统计计算:方差、极差等)。

现在的任务是,需要从前端得到这所有的十几万条数据,以及另外计算得到的十几个参数。其宗问题是,在数据库中获取数据的过程非常慢,大约的两分钟。

现在我有几种解决方案:

  1. 后端得到这十几万条数据,后端提供一个 api ,用来处理前端的 get 请求,将这些数据发送到前端,然后在前端计算另外的十几个参数。这里有可能占用内存较大,而且需要客户端来完成计算。
  2. 后端得到这十几万条数据,然后将这些数据存储为一个类的类变量。后端提供多个 api ,首先要有得到十几万条结果数据的 api ,还要有另外的十几个 api 用来分别得到另外十几个参数,也就是说例如需要得到方差的时候,使用类里面存储的十几万条结果实时计算得到。这个设计的问题,可能是这十几万条数据比较占用内存,在后端长期驻留。
  3. 后端同样提供多个 api ,像上面一样。但是,那十几条参数的 api 都不涉及计算,而是在获取十几万条结果数据的 api 里面计算得到,然后存储到类的私有变量里面。十几条参数的 api 仅仅是这些似有成员的 getter 就可以。这个设计的问题可能是不统一,因为前端必须先调用获取十几万条结果的 api ,才能调用其他的 api ,否则得到的结果是假的结果。但是这个设计对内存友好,因为只是在一个函数里面存储了十几万条数据,等出了这个函数就垃圾回收了。
  4. 最后一种方案是只提供一个 api ,这个 api 返回一个 json 。 json 里面除了提供十几万条结果数据之外,还提供另外的十几个参数。

描述的可能比较麻烦,非常感谢大家能为我指点迷津!感谢

2947 次点击
所在节点    程序员
26 条回复
nicevar
2016-11-28 12:06:00 +08:00
不是专业做服务器开发的,有个建议,可以考虑中间用 mongodb 过度,有公司是这样做的
hujianxin
2016-11-28 12:06:05 +08:00
@just4test 抽样的方法是个好办法,我回去仔细想想。
@kimchan 我的数据不是实时的,是点一下按钮,然后开始计算,然后现实。
hujianxin
2016-11-28 12:07:20 +08:00
@scys 谢谢提供思路,我确实可以不用把全部的数据弄过来,谢了。
Miy4mori
2016-11-29 01:53:32 +08:00
见过一个请求 6mb 的应用,用 ng2 做客户端排序和搜索,除了加载慢点也没啥毛病。客户端崩溃是不太可能的,浏览器还没娇惯到存十几兆数据就崩溃。其实我有一次用 js 读了 1g 的视频文件到内存里都没有崩溃,就是多吃了点内存………
Miy4mori
2016-11-29 01:55:11 +08:00
我觉得你要考虑考虑如果这个接口并发高了服务端会不会崩溃
lslqtz
2016-11-29 02:54:45 +08:00
@hujianxin 数据可视化的话,就分页+一些算好的数据传过去就好了

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

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

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

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

© 2021 V2EX