2

サーバー上のプログラムによって生成された継続的に生成されるデータ (テキスト ファイル) があります。powergridと同じように、データをリアルタイム グラフとしてプロットしたいと考えています。これが私のアプローチでした:

データはサーバー上でテキスト ファイルとして継続的に生成されるため、そのファイル ( get_file_contents) を読み取り、データ ポイントを出力し、sparkline jQuery プラグインを使用してグラフをプロットする PHP スクリプトを作成しました。しかし問題は、ファイルを一度にすべて読み取ることです。さらに、テキスト ファイルは増え続けています。誰かが私により良いアプローチを提案できますか?

4

3 に答える 3

3

Javascriptプロットソリューションの使用について話しているときは、次のようにします。

  • ページの読み込み時に、完全なテキストファイルを読み取り、そのサイズを記憶することにより、現在のグラフを作成します。
  • ページが読み込まれた後、AJAX-techniques(XMLHttpRequest)を使用してサーバー上の特定のスクリプトを定期的にポーリングし、テキストファイルの最後に認識されたファイルサイズをパラメーターとして渡すJavascript関数を作成します。
  • ポーリングスクリプトはfilesizeパラメーターを受け取り、テキストファイルを開き、最後にファイルを読み取ったポイント(filesize-parameter)に到達するまでファイルをスキップします。
  • ポーリングスクリプトは、ファイルサイズからファイルの終わりおよび新しいファイルサイトまでのすべての利用可能なデータを返します
  • JavascriptがAJAX応答を読み取り、必要なプロットポイントをグラフに追加します
  • 次に、新しいファイルサイズをパラメーターとして使用して、サーバー側スクリプトのポーリングをやり直すことができます。

この手順には、サーバー側とクライアント側のプログラミングが含まれますが、簡単に実行できます。

index以下は、テキストファイルを読み取る位置をスクリプトに指示し、JSONでエンコードされたプロットポイントのリストと新しいインデックスポインターを返すパラメーターを必要とするポーリングスクリプトのサンプルです。

// poll.php
$index = (isset($_GET['index'])) ? (int)$_GET['index'] : 0;
$file = fopen('path/to/your/file.txt', 'r');
$data = array(
    'index' => null,
    'data'  => array()
);
// move forward to the designated position
fseek($file, $index, SEEK_SET);
while (!feof($file)) {
    /*
     * assuming we have a file that looks like
     * 0,10
     * 1,15
     * 2,12
     * ...
     */
    list($x, $y) = explode(',', trim(fgets($handle)), 2);
    $data['data'][] = array('x' => $x, 'y' => $y);
}
// set the new index
$data['index'] = ftell($file);
fclose($file);

header('Content-Type: application/json');
echo json_encode($data);
exit();

対応するJavascript/jQueryスニペットは次のようになります。

// the jQuery code to poll the script
var current = 0;
function pollData() {
    $.getJSON('poll.php', { 'index': current }, function(data) {
        current = data.index;
        for (var i= 0; i < data.data.length; i++) {
            var x = data.data[i].x;
            var y = data.data[i].y;
            // do your plotting here
        }
    });
}
// call pollData() every 5 seconds
var timer = window.setInterval(pollData, 5000);

これは単なる例であり、すべてのエラーチェックが欠けていることに注意してください(たとえばpollData()、同じページでの同時呼び出しは問題になります)。

于 2009-11-13T13:44:12.577 に答える
3

視覚化の部分はほとんどうまくいったようです。データセットが大きすぎて再計算できない場合は、増分ヒストグラムを維持するための手法を検討することをお勧めします。ここに役立つかもしれないいくつかの論文があります:

于 2009-11-13T13:45:08.487 に答える
0

まず、ユーザー側でグラフを生成しません。これには単純な理由があります。すべての人が JavaScript を有効にしているわけではなく (ターゲット グループによって異なります)、おそらくそれほど高速ではありません。

すでに PHP を使用しているため、サーバー側でグラフを作成するにはpChartなどのパッケージを使用することをお勧めします。これのもう 1 つの肯定的な副作用は、パッケージにもキャッシュが付属していることです。これにより、たとえば、データテキストファイルが変更された場合にのみグラフを作成できます(PHPでも生成すると仮定します-そうでない場合は、PHPスクリプトが実行されるたびにファイルが変更されたかどうかを簡単に確認できます)。リソースの負荷を節約 ;)

于 2009-11-13T13:34:31.700 に答える