【发布时间】:2013-10-25 17:50:27
【问题描述】:
我们的网站为我们的客户提供各种数据服务;其中之一是仪表数据。有些仪表每 15 分钟记录一次信息,有些则每分钟记录一次。这些数据被发送到我们的 SQL 数据库。
所有这些数据都通过图表(通过 PHP 和 JPGraphs 生成的服务器端)显示,每个单独的日志条目在可折叠表中显示为一行(jquery 1.10.2)。
当客户想要查看数据时,他们会选择一个日期范围以及他们想要查看的仪表。如果他们想查看每分钟记录的仪表的最后 3 天,那么它会很快加载。如果他们想查看其中的 2 个,则加载大约需要 15-30 秒。当他们想要查看一个月的数据时,真正的问题就出现了。尤其是超过 1 个规格。这可能需要 15-20 分钟才能加载,并且浏览器会反复询问我们是否要停止脚本填充可折叠表格行(jquery)。
显然这是一个问题,因为客户希望得到相对快速的响应(最多 1-5 分钟)。理想情况下,我们还希望能够一次提取几个月的仪表数据。我们现在唯一能做到这一点的方法是一次提取 2 周的数据并手动编译总数。
供参考:如果我想为我们的 2 个每分钟一次的日志记录仪提取一个月的数据,那么将通过 jQuery 将 86,400 行添加到可折叠表中。该页面大约需要。加载 5 分钟,在此期间浏览器非常慢。
我的问题是:使用基于 PHP 的服务器(Symfony 1.4 框架)和 javascript 提取/绘制/填充数据的最佳方式是什么?
我们是否应该考虑升级我们分配的处理能力/RAM(我们由 GoDaddy 托管)?有没有比 jquery 更快的方法来填充可折叠文件?我们所有的计算都是在服务器端完成的。我们应该只提取原始数据并让客户端进行数据处理吗?我们应该在客户端和服务器之间拆分数据处理吗?
这是网页的屏幕截图。对其进行裁剪,以便不显示更多对客户敏感的信息:
【问题讨论】:
-
这可能不适合您,因为您还需要显示图表。但是,每当我不得不提取非常大的数据集(数百万行)时,我之前做过的一件事是实际上没有将整个数据传递给客户端。只通过前 200 个。然后让用户能够请求更多数据。例如,无限滚动之类的东西。如果您有兴趣,我可以给出更详细的答案。
-
如果有需要在服务器上进行处理,可以对数据进行预处理和缓存。将预先缓存的数据(可能是array_merge)连接在一起很容易,而且可能要快得多。除此之外,您可以分块加载数据。向下滚动时对数据进行分页和/或通过 ajax 加载。
-
84'000 个数据点对于读取数据的人来说几乎是无法管理的,不是吗?您是否考虑过在绘制图表之前汇总数据以使绘制的数据集更小?
-
感谢您的回复。 @Pompey我对更详细的答案感兴趣。我需要一次在服务器端获取所有数据,以便创建图表,那么您是否建议我缓存这些数据并只为可折叠表发送一小部分?然后,如果它们向下滚动得足够远,我会通过 ajax 为可折叠设备发送更多数据吗?另外这里是我的网页的几个屏幕截图。它被裁剪了,所以更详细的客户信息被排除在外:imgur.com/a/wRF1d#0
-
@twelfth 客户不想要任何“松散”的数据。换句话说,他们不希望对绘制的数据进行任何类型的估计或四舍五入。他们想要尽可能准确的图表和数据显示(即不将一小时的读数四舍五入为 1)
标签: javascript php sql symfony