0

調査プロジェクトのために、地元のバス会社の GPS システムから (API を介して) データを取得しています。車両、ルート ID、場所、目的地などのデータを取得するために毎分実行される php cron ジョブを作成しました。データには、各バス ルートの一意の「実行番号」が含まれていませんでした (追跡できるようにするための一意の番号)。そのため、車両 ID、目的地、および相対時間が類似しているかどうかを確認し、一意の「走行 ID」を割り当てる独自のバスを作成して、そのルートに沿ってバスを追跡できるようにしました。ルート。実行 ID が存在しない場合は、ランダムに生成されます。(最後に挿入された行 "timeadded" の 2 分以内に同じ "vid" と "pid" を持つ車両はすべて同じ走行にあり、これは私の研究にとって重要です)

cron が実行されるたびに (1 分間)、約 80 行がデータベースに追加されます。

最初は、ジョブはすぐに実行されます。ただし、現在 500,000 行を超えているため、ジョブに 40 秒以上かかる場合があることに気付きました。〜80行ごとに、テーブル全体(「車両」)をチェックして同じ実行IDが存在するかどうかを確認する必要があり、基本的に大きなテーブルをクエリして行を80回挿入する必要があるためだと思います。少なくとも 1 週間分のデータ (現在 4 日目) を取得したいと考えています。この時点で、データをエクスポートし、すべての行を消去して、最初からやり直すことができます。私の質問は、PHP/SQL コードをリファクタリングしてプロセスを高速化する方法はありますか? 私が SQL を扱ってから何年も経っているので、このすべてのデータを挿入するもっと独創的な方法があると確信しています。

<?php
// Obtain data from XML
$xml = simplexml_load_file("url.xml");
foreach ($xml->vehicle as $vehicle) {
    $vid = $vehicle->vid;
    $tm = $vehicle->tmstmp;
    $dat = substr($vehicle->tmstmp, 0, 8);
    $tme = substr($vehicle->tmstmp, 9);
    $lat = $vehicle->lat;
    $lon = $vehicle->lon;
    $hdg = $vehicle->hdg;
    $pid = $vehicle->pid;
    $rt = $vehicle->rt;
    $des = $vehicle->des;
    $pdist = $vehicle->pdist;

     // Database connection and insert
    mysql_connect("redacted", "redacted", "redacted") or die(mysql_error()); mysql_select_db("redacted") or die(mysql_error());
    $sql_findsim = "SELECT vid, pid, timeadded, run, rt FROM vehicles WHERE vid=" . mysql_real_escape_string($vid). " AND pid=" . mysql_real_escape_string($pid). " AND rt=" . mysql_real_escape_string($rt). " AND timeadded > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MINUTE);";
    $handle = mysql_query($sql_findsim);
    $row = mysql_fetch_row($handle);
    $runid = $row[3];
    if($runid !== null) {
        $run = $runid;
    } else {
        $run = substr(md5(rand()), 0, 30);
    }
    $sql = "INSERT INTO vehicles (vid, tmstmp, dat, tme, lat, lon, hdg, pid, rt, des, pdist, run) VALUES ($vid,'$tm','$dat','$tme','$lat','$lon',$hdg,$pid,'$rt','$des',$pdist,'$run')";
    $result = mysql_query($sql);

mysql_close();

}

?>

このコードをリファクタリングして、より迅速かつ効率的に実行できるようにしていただきありがとうございます。

4

2 に答える 2