2012-09-11 32 views
2

我目前使用以下HighCharts:HighStock:图表:http://www.highcharts.com/stock/demo/data-grouping为了显示从服务器返回的数据。巨大的数据和PHP错误

我们从MySQL数据库中检索数据,真的很大。我们每隔1秒就存储一次传感器指标。一段时间后,我们得到了以下错误:

[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4756882 bytes) in C:\\wamp\\www\\admin\\getTrends.php on line 156, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP Stack trace:, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP 1. {main}() C:\\wamp\\www\\admin\\getTrends.php:0, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP 2. getTrendsDataAI() C:\\wamp\\www\\admin\\getTrends.php:33, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP 3. printResults() C:\\wamp\\www\\admin\\getTrends.php:102, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP 4. createData() C:\\wamp\\www\\admin\\getTrends.php:230, referer: http://localhost/admin/trends.php 
[Wed Sep 12 00:15:56 2012] [error] [client 127.0.0.1] PHP 5. implode() C:\\wamp\\www\\admin\\getTrends.php:156, referer: http://localhost/admin/trends.php 

什么是这个数据作为JSON对象返回HighStocks观看的最佳解决方案?我们如何才能克服PHP的限制?我们每次都要返回大块数据吗?他们通常如何向用户提供大量的数据并根据这些数据创建图表和报告?我们需要克服的另一个大问题是返回的JSON对象是巨大的。此时约为20-30 mbs,未来将会更大。可以将这些数据返回给用户并执行所有客户端?

任何建议或想法的欢迎。

+0

我以前使用过RRD存储传感器数据,它运行良好,根据我的经验,比传感器数据的MySQL更好。有一个PECL扩展与RRD交互。 RRD还会在您可以设置的点上修剪数据,因此在一个月之后,而不是每秒都有数据,它会用每分钟的平均值代替那些数据,或者您想要配置它。 RRDTool:http://oss.oetiker.ch/rrdtool/ 扩展:http://php.net/manual/en/book.rrd.php –

+0

我会尽量减少你的数据点的数量发送。例如。如果您每小时发送100,000个数据点,请尝试发送每日数据点(大约4200个)。 –

+1

但是,如果精度是一个关键的要求呢? – glarkou

回答

0

JSON并不是真的可以修改为块。每个json字符串都必须是完整的,因为它直接表示一个完整的数据结构:一个字符串,一个数组,一个对象等...

你可以做的是将数据通过独立的块,并在JS中重建数据结构。例如请求#1发送超过10,000行的数据,请求#2获得10,001-20,000,#3获得20,001-30,000等等......

但是你仍然会在你的内存中占用大量内存浏览器。对于大型结构,PHP和JS都不是特别有效的内存。

+0

因此,对于替代技术的任何建议? – glarkou

+0

不是真的。或者通过总结/分组(例如)日大小而不是分钟大小来减少数据量,或者放弃基本上使整个数据库在整个线路上徘徊。 –

2

当显示大量的数据时,我认为你可以做的最好的事情(最常见的)是以特定的分辨率生成视图。

随着用户范围缩小(缩小)当对一个给定的点,你会增加对现货的分辨率,从而降低了块

这种方式,您可以生成通过PHP文件尺寸更小的总体尺寸,那将理想地表示相同的图表。类似于谷歌地图用于工作的方式。

+0

+1我同意。要添加...您需要执行一些类型的服务器处理,以基于当前缩放级别限制您正在使用的记录数。我最近回答了一个[**问题**](http://stackoverflow.com/a/12534878/1253219),其中介绍了如何在缩放级别执行服务器端处理的链接。 – Linger