私は999,000レコードのリストデータを持っています。PHP - 大きなデータセットを処理するときに許容されるメモリを超過
データを取得するためにselectクエリとwhileループがあります。array_pushを使用して、取得した値を1つの配列にループで追加します。
そして、すべてのループがこの配列の1000個の値を処理するようにします。
ビッグデータと使用array_push
が、私はエラーを取得するときに私の問題がある:
Fatal Error: Allowed Memory Size of 134217728 Bytes
は、どのように私は私の問題を解決するために私のコードを最適化することができますか?
私のコードは以下の通りです:
$sql = "select customer_id";
$sql .= " from";
$sql .= " t_customer t1";
$sql .= " inner join t_mail_address t2 using(mid, customer_id)";
$result = $conn->query($sql);
$customerArray = array();
while ($row = $result ->fetch(PDO::FETCH_ASSOC)) {
array_push($customerArray , $row);
}
// Execute every 1000 record
foreach(array_chunk($customerArray , 1000) as $execCustomerArray) {
// My code to execute for every records.
// ....
}
これらの〜1mレコードの各レコードが〜1kbのサイズであると仮定しましょう。それらは〜1GBのメモリといくつかのオーバーヘッドを消費します。通常は一度に多くのデータをメモリに保存する必要はありません。どうしてそんなことをする必要がありますか?一度に一つのレコードを処理しながら、データベースからフェッチする 'while'ループで処理します。 – deceze
1000レコードごとに何かするつもりなら、whileループの中で1000をヒットしたかどうかチェックするだけでいいのですか? –
取得する前にクエリ結果をチャンクする必要があります。後でない。 'LIMIT'と' OFFSET'を使用してページ単位の結果を取得し、必要なだけ多くのクエリを実行してください – apokryfos