大量数据和 PHP 错误
Posted
技术标签:
【中文标题】大量数据和 PHP 错误【英文标题】:Enormous data and PHP errors 【发布时间】:2012-09-04 21:18:54 【问题描述】:我目前正在使用以下 HighCharts:HighStock:Charts:http://www.highcharts.com/stock/demo/data-grouping 来显示从服务器返回的数据。
我们从 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,未来会更大。是否可以将此数据返回给用户并在客户端执行所有操作?
欢迎提出任何建议或想法。
【问题讨论】:
我过去曾使用 RRD 来存储传感器数据,它运行良好,而且根据我的经验,在传感器数据方面比 MySQL 更好。有一个用于与 RRD 交互的 PECL 扩展。 RRD 还会在您可以设置的点处修剪数据,因此一个月后,它不会拥有每秒的数据,而是会用每分钟的平均值替换那些数据,或者您想要配置它。 RRDTool:oss.oetiker.ch/rrdtool 分机:php.net/manual/en/book.rrd.php 我会尝试减少您发送过来的数据点的数量。例如。如果您每小时发送 100,000 个数据点,请尝试发送每日数据点(大约是 4,200 个)。 但是如果精度是一个关键要求呢? 【参考方案1】:当显示大量数据时,我认为您能做的最好的事情(也是最常见的)就是生成具有特定分辨率的视图。
当用户缩小(放大)给定点时,您将增加该点的分辨率,从而减小块的整体大小
通过这种方式,您可以通过 php 生成更小的文件大小,这将理想地表示相同的图表。类似于谷歌地图过去的工作方式。
【讨论】:
+1 我同意。要添加...您需要进行某种类型的服务器处理,以根据当前缩放级别限制您正在使用的记录数。我最近回答了question,其中包含解释如何在缩放级别上进行服务器端处理的链接。【参考方案2】:JSON 并不能真正修改为分块。每个 json 字符串本身必须是完整的,因为它直接表示一个完整的数据结构:字符串、数组、对象等......
您可以做的是将数据以独立的块发送,并在 JS 中重建数据结构。例如请求 #1 发送超过 10,000 行的数据,请求 #2 获得 10,001-20,000,请求 #3 获得 20,001-30,000 等等...
但您最终仍会在浏览器中占用大量内存。对于大型结构,PHP 和 JS 的内存效率都不是特别高。
【讨论】:
那么对替代技术有什么建议吗? 并非如此。要么通过汇总/分组为(例如)一天大小的块而不是分钟大小来减少数据量,要么只管基本上通过网络吞食整个数据库。以上是关于大量数据和 PHP 错误的主要内容,如果未能解决你的问题,请参考以下文章