2012-09-11 30 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