Highchart live server示例使用了很多cpu

时间:2013-03-13 13:29:04

标签: javascript sqlite highcharts

我有一个嵌入式Linux系统,它会收集一些数据并将其放入SQLite数据库中。每秒都会添加新数据。我想从数据库中获取这些数据并将其绘制在带有highchart的图表中。因此,每一秒都需要将新点添加到图表中。

我使用以下示例作为起点:http://www.highcharts.com/studies/live-server.htm

它可以工作,但当我访问页面时,我的CPU使用50%(我使用chrome)。如果我绘制morge图表,甚至100%。即使使用实时服务器示例,我也可以看到我的cpu使用率上升。我试着寻找一个芒果但找不到任何东西。这是最好的方法吗?或者这是一个错误还是我错过了什么?以下是我的一些代码:

function request_accu_Data() {
    $.ajax({
        url: 'live-accu-data.php', 
        success: function(point) {
            var accu_series = accu_chart.series[0];
                shift = accu_series.data.length > 100; // shift if the series is longer than 100

            // add the point
            accu_chart.series[0].addPoint(eval(point), true, shift);

            // call it again after one second
            setTimeout(request_accu_Data, 500); 
        },
        cache: false
    });
}

$(document).ready(function() {
    accu_chart = new Highcharts.Chart({
        chart: {
            renderTo: 'Accu_graph_container',
            defaultSeriesType: 'spline',
            events: {
                load: request_accu_Data
            }
        },

        tooltip: {
             formatter: function() {

              return false;
               }
        },
            title: {
            text: 'Accu level'
        },
        xAxis: {
            type: 'datetime',
            tickPixelInterval: 150,
            maxZoom: 20 * 1000
        },
        yAxis: {
            minPadding: 0.9,
            maxPadding: 0.9,
            min: 0,
            max: 100,
            title: {
                text: '%',
                margin: 10
            }
        },
        series: [{
            //pointInterval: 3600 * 1000,
            name: 'Accu level',
            data: [
            ]
        }]
    });

php代码如下所示:

<?php 
// Set the JSON header
header("Content-type: text/json");


$db = new PDO('sqlite:/home/pi/client.db');
$result = $db->query('SELECT * FROM log ORDER BY ROWID DESC LIMIT 1');
foreach($result as $row){
    $ret = intval( $row['Timestamp'])*1000;
    $ret2= intval( $row['Accu_level']);
}

$tot = array($ret,$ret2);

echo json_encode($tot);
?>

我真的希望你能帮助我!

2 个答案:

答案 0 :(得分:2)

我能想到的唯一建议是:

  1. 不经常轮询服务器。您现在每500毫秒轮询一次。
  2. 在highcharts中禁用动画。
  3. 如果要向多个系列添加点数,请在不重绘图表的情况下添加每个点,然后在结尾处重绘。
  4. 注意,要禁用动画,您需要设置:

    animation:false
    

    在图表定义中,但您还需要在addPoint调用中禁用它。

    accu_chart.series[0].addPoint(eval(point), true, shift, false);
    

答案 1 :(得分:0)

答案很晚,但我建议你不要将MySQL用于这类数据。看一下Timestore,它是RRD和noSQL概念的混合体:http://www.mike-stirling.com/redmine/projects/timestore 我将它用于一个项目,它非常快且CPU效率高。