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 に指示しています。
これをより良く構造化する方法はありますか?これらの同時サイクルを実行することについて、私はちょっと迷っています。