1

mysql に 150 行のデータ セットがあります。一部のユーザー入力とデータセットに基づいて数学計算を実行する 2 つの for ループのセットがあります。このコードは 30 行ウィンドウの計算を行い、30 行ウィンドウごとに結果を配列に蓄積します。つまり、行 0 ~ 29、次に 1 ~ 30、次に 2 ~ 31 などで計算の「サイクル」を実行すると、120 の「サイクル」になります。

現在、for ループはそのように設定されています (さらにフィールドがあります。この質問を簡単にするためにコードをトリミングしました。

    $period=30;
    $query = "SELECT * FROM table"; 
    $result = mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
        $data[] = array("Date" => $row['Date'], "ID" => $row['ID']); 
    }
    for($i=0;$i<(count($data)-$window);$i++){
        for($j=0;$j<$window;$j++){
            //do calculations here with $data[]
            $results[$i][$j]= calculations;
        }
    }

これは、私が持っている行数に対してうまく機能します。ただし、別のウィンドウ (360 行) でより大きなデータセット (1700 行) にスクリプトを開きました。これは、指数関数的に多くの反復があることを意味します。メモリ不足エラーが発生しました。memory_get_peak_usage() を簡単に使用すると、メモリが継続的に増加することがわかりました。

特に「ウィンドウ」が多くの「サイクル」で重なっている場合、そのデータ配列をループで検索するのは非常に面倒だと思い始めています。例: サイクル 0 は行 0 ~ 29 を通過します。サイクル 1 は行 1 ~ 30 を通過します。したがって、これらのサイクルはどちらも必要なデータの行を共有しますが、毎回新しいデータを探すように PHP に指示しています。

これをより良く構造化する方法はありますか?これらの同時サイクルを実行することについて、私はちょっと迷っています。

4

2 に答える 2

0

SQL の方法

を使用してこれを実現できますLIMIT

$period = 30;
$cycle = 0; //
$query = "SELECT * FROM table LIMIT $cycle,$period";

これにより、各サイクルに必要な結果のみが返されます。ループしてインクリメントする必要があります$cycle。ただし、現在行っている方法の方がおそらく優れています。

ただし、これはループバックせず、最初のデータを取得します。その場合を処理するには、追加のロジックを追加する必要があります。

于 2013-07-30T17:54:35.940 に答える